输入文本对话框Android

Luk*_*lor 274 android text input

当用户点击Button我的应用程序(在a中打印SurfaceView)时,我想要Dialog显示一个文本,我想将结果存储在一个String.我希望文本Dialog覆盖当前屏幕.我怎样才能做到这一点?

Aar*_*ron 547

听起来像是使用AlertDialog的好机会.

尽管看起来很基本,Android没有内置的对话框(据我所知).幸运的是,除了创建标准的AlertDialog之外,还需要一些额外的工作.您只需为用户创建一个EditText来输入数据,并将其设置为AlertDialog的视图.如果需要,您可以使用setInputType自定义允许的输入类型.

如果您能够使用成员变量,则只需将变量设置为EditText的值,并且在对话框解除后它将保持不变.如果您不能使用成员变量,则可能需要使用侦听器将字符串值发送到正确的位置.(如果这是你需要的话,我可以编辑和详细说明).

在你的课堂上:

private String m_Text = "";
Run Code Online (Sandbox Code Playgroud)

在按钮的OnClickListener中(或从那里调用的函数):

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Title");

// Set up the input
final EditText input = new EditText(this);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
input.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
builder.setView(input);

// Set up the buttons
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() { 
    @Override
    public void onClick(DialogInterface dialog, int which) {
        m_Text = input.getText().toString();
    }
});
builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }
});

builder.show();
Run Code Online (Sandbox Code Playgroud)

  • 我认为不是为上下文创建全局变量,而是可以传递上下文:"MainActivity.this"(您需要将文本"MainActivity"替换为您要使用的活动类名称). (8认同)
  • 可能值得注意的是,像大多数Android UI一样,这都是异步的...意味着它不会等待用户点击OK,除非你有一些东西使得下一步的大门...... (3认同)
  • 哦。如果您在工作线程上,请尝试放置 builder.show(); 使用 runOnUiThread 调用,类似于这个例子:http://stackoverflow.com/a/3134720/1098302 或者最好把上面的所有代码(创建 AlertDialog)放在一个单独的方法中,并从在 runOnUiThread 中。 (2认同)
  • 谢谢.非常好.然而,有一点问题.需要声明`global Context,Context cont;`然后在`cont`中用alertdialog替换"this".AlertDialog.Builder builder = new AlertDialog.Builder(续); final EditText input = new EditText(cont); (2认同)

Mic*_*hal 90

我将使用一种方法更新@Aaron更新,这种方法将为您提供更好地设置对话框的机会.这是调整后的例子:

AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
builder.setTitle("Title");
// I'm using fragment here so I'm using getView() to provide ViewGroup
// but you can provide here any other instance of ViewGroup from your Fragment / Activity
View viewInflated = LayoutInflater.from(getContext()).inflate(R.layout.text_inpu_password, (ViewGroup) getView(), false);
// Set up the input
final EditText input = (EditText) viewInflated.findViewById(R.id.input);
// Specify the type of input expected; this, for example, sets the input as a password, and will mask the text
builder.setView(viewInflated);

// Set up the buttons
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.dismiss();
        m_Text = input.getText().toString();
    }   
}); 
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        dialog.cancel();
    }   
}); 

builder.show();
Run Code Online (Sandbox Code Playgroud)

以下是用于创建EditText对话框的布局示例:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="@dimen/content_padding_normal">

    <android.support.design.widget.TextInputLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <AutoCompleteTextView
            android:id="@+id/input"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="@string/hint_password"
            android:imeOptions="actionDone"
            android:inputType="textPassword" />

    </android.support.design.widget.TextInputLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)

在这里你可以找到结果:

EditText对话框示例

  • 一流的解决方案!我只是用'findViewById(android.R.id.content)`替换`getView()`,它就像魅力一样.非常感谢分享 :) (8认同)
  • 只是想知道,但是`@dimen/content_padding_normal` 的值是什么? (4认同)
  • “此处不允许使用元素 AutoCompleteTextView...” (2认同)

bhe*_*man 61

这个怎么样?这似乎很简单.

final EditText txtUrl = new EditText(this);

// Set the default text to a link of the Queen
txtUrl.setHint("http://www.librarising.com/astrology/celebs/images2/QR/queenelizabethii.jpg");

new AlertDialog.Builder(this)
  .setTitle("Moustachify Link")
  .setMessage("Paste in the link of an image to moustachify!")
  .setView(txtUrl)
  .setPositiveButton("Moustachify", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
      String url = txtUrl.getText().toString();
      moustachify(null, url);
    }
  })
  .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
    }
  })
  .show(); 
Run Code Online (Sandbox Code Playgroud)

  • 和Aaron几乎一样,但是把建筑师联系起来.个人偏好的问题都很好. (3认同)

Pha*_*inh 10

如果你想在一定的空间leftrightinput观点,你可以添加一些填充像

private fun showAlertWithTextInputLayout(context: Context) {
    val textInputLayout = TextInputLayout(context)
    textInputLayout.setPadding(
        resources.getDimensionPixelOffset(R.dimen.dp_19), // if you look at android alert_dialog.xml, you will see the message textview have margin 14dp and padding 5dp. This is the reason why I use 19 here
        0,
        resources.getDimensionPixelOffset(R.dimen.dp_19),
        0
    )
    val input = EditText(context)
    textInputLayout.hint = "Email"
    textInputLayout.addView(input)

    val alert = AlertDialog.Builder(context)
        .setTitle("Reset Password")
        .setView(textInputLayout)
        .setMessage("Please enter your email address")
        .setPositiveButton("Submit") { dialog, _ ->
            // do some thing with input.text
            dialog.cancel()
        }
        .setNegativeButton("Cancel") { dialog, _ ->
            dialog.cancel()
        }.create()

    alert.show()
}
Run Code Online (Sandbox Code Playgroud)

dimens.xml

<dimen name="dp_19">19dp</dimen>
Run Code Online (Sandbox Code Playgroud)

希望对你有帮助


Abd*_*lah 10

这对我有用

private void showForgotDialog(Context c) {
        final EditText taskEditText = new EditText(c);
        AlertDialog dialog = new AlertDialog.Builder(c)
                .setTitle("Forgot Password")
                .setMessage("Enter your mobile number?")
                .setView(taskEditText)
                .setPositiveButton("Reset", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        String task = String.valueOf(taskEditText.getText());
                    }
                })
                .setNegativeButton("Cancel", null)
                .create();
        dialog.show();
    }
Run Code Online (Sandbox Code Playgroud)

怎么打电话?(当前活动名称)

showForgotDialog(current_activity_name.this);


Mag*_*s W 5

我发现它扩展AlertDialog.Builder创建自定义对话框类更加干净和可重用。这是一个对话框,要求用户输入电话号码。也可以通过setNumber()在拨打电话之前拨打电话来提供预设的电话号码show()

InputSenderDialog.java

public class InputSenderDialog extends AlertDialog.Builder {

    public interface InputSenderDialogListener{
        public abstract void onOK(String number);
        public abstract void onCancel(String number);
    }

    private EditText mNumberEdit;

    public InputSenderDialog(Activity activity, final InputSenderDialogListener listener) {
        super( new ContextThemeWrapper(activity, R.style.AppTheme) );

        @SuppressLint("InflateParams") // It's OK to use NULL in an AlertDialog it seems...
        View dialogLayout = LayoutInflater.from(activity).inflate(R.layout.dialog_input_sender_number, null);
        setView(dialogLayout);

        mNumberEdit = dialogLayout.findViewById(R.id.numberEdit);

        setPositiveButton("OK", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                if( listener != null )
                    listener.onOK(String.valueOf(mNumberEdit.getText()));

            }
        });

        setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                if( listener != null )
                    listener.onCancel(String.valueOf(mNumberEdit.getText()));
            }
        });
    }

    public InputSenderDialog setNumber(String number){
        mNumberEdit.setText( number );
        return this;
    }

    @Override
    public AlertDialog show() {
        AlertDialog dialog = super.show();
        Window window = dialog.getWindow();
        if( window != null )
            window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
        return dialog;
    }
}
Run Code Online (Sandbox Code Playgroud)

dialog_input_sender_number.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        android:paddingBottom="20dp"
        android:text="Input phone number"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

    <TextView
        android:id="@+id/numberLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/title"
        app:layout_constraintLeft_toLeftOf="parent"
        android:text="Phone number" />

    <EditText
        android:id="@+id/numberEdit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toBottomOf="@+id/numberLabel"
        app:layout_constraintLeft_toLeftOf="parent"
        android:inputType="phone" >
        <requestFocus />
    </EditText>

</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

用法:

new InputSenderDialog(getActivity(), new InputSenderDialog.InputSenderDialogListener() {
    @Override
    public void onOK(final String number) {
        Log.d(TAG, "The user tapped OK, number is "+number);
    }

    @Override
    public void onCancel(String number) {
        Log.d(TAG, "The user tapped Cancel, number is "+number);
    }
}).setNumber(someNumberVariable).show();
Run Code Online (Sandbox Code Playgroud)


Stu*_*gns 5

@LukeTaylor:我目前手头有同样的任务(创建一个包含 EditText 的弹出窗口/对话框)。就
我个人而言,我发现完全动态的路线在创造力方面有些限制。

完全自定义对话框布局:您可以像这样完全自定义它,

而不是完全依赖代码来创建对话框:

1) -创建一个新Layout Resource文件..这将充当您的对话框,允许完全的创作自由!
注意:请参阅 Material Design 指南以帮助保持清洁和重点。

2) -为所有View元素提供ID .. 在下面的示例代码中,我有 1EditText和 2 Buttons

3) -创建Activity一个Button, 用于测试目的.. 我们会让它膨胀并启动您的对话框!

public void buttonClick_DialogTest(View view) {

    AlertDialog.Builder mBuilder = new AlertDialog.Builder(MainActivity.this);

    //  Inflate the Layout Resource file you created in Step 1
    View mView = getLayoutInflater().inflate(R.layout.timer_dialog_layout, null);

    //  Get View elements from Layout file. Be sure to include inflated view name (mView)
    final EditText mTimerMinutes = (EditText) mView.findViewById(R.id.etTimerValue);
    Button mTimerOk = (Button) mView.findViewById(R.id.btnTimerOk);
    Button mTimerCancel = (Button) mView.findViewById(R.id.btnTimerCancel);

    //  Create the AlertDialog using everything we needed from above
    mBuilder.setView(mView);
    final AlertDialog timerDialog = mBuilder.create();

    //  Set Listener for the OK Button
    mTimerOk.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View view) {
            if (!mTimerMinutes.getText().toString().isEmpty()) {
                Toast.makeText(MainActivity.this, "You entered a Value!,", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(MainActivity.this, "Please enter a Value!", Toast.LENGTH_LONG).show();
            }
        }
    });

    //  Set Listener for the CANCEL Button
    mTimerCancel.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick (View view) {
            timerDialog.dismiss();
        }
    });

    //  Finally, SHOW your Dialog!
    timerDialog.show();


    //  END OF buttonClick_DialogTest
}
Run Code Online (Sandbox Code Playgroud)


小菜一碟!完全的创作自由!请务必遵循材料指南 ;)

我希望这对某人有所帮助!让我知道你们的想法!

  • 只是好奇为什么(-1)投反对票?我提供的逻辑完全按照预期和描述的那样工作......我觉得这是对这篇文章的一个很好的补充,还没有提到,并且是一个完美的替代解决方案。_然而_,如果你有合理的理由拒绝我提供的信息,如果你能提供一些你为什么这样做的背景会更有帮助,所以我和其他人可以学习和理解推理.. 拒绝投票实际上可以非常在学习过程中有用和有帮助——但只有在原因背后有背景时。 (2认同)