输入文本对话框

当用户在我的应用程序中单击Button(打印在SurfaceView中)时,我希望出现一个文本Dialog,并将结果存储在String中。我想让文本Dialog覆盖当前屏幕。我该怎么做呢?

381943 次浏览

这个例子怎么样?这似乎很简单。

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();

听起来像是一个使用AlertDialog的好机会。

就像它看起来一样基本,Android并没有内置的对话框来做到这一点(据我所知)。幸运的是,这只是在创建标准AlertDialog之上的一点额外工作。您只需要为用户创建一个EditText来输入数据,并将其设置为AlertDialog的视图。如果需要,可以使用setInputType自定义允许输入的类型。

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

在你的班级内:

private String m_Text = "";

在你的按钮的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();

我将使用一种方法添加到@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();

下面是创建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>

最终结果:

EditText Dialog example

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

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;
}
}

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>

< em >用法:< / em >

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();

如果你想在input视图的leftright处有一些空间,你可以添加一些填充,比如

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()
}

dimens.xml

<dimen name="dp_19">19dp</dimen>

希望能有所帮助

@LukeTaylor:我目前有同样的任务在手(创建一个弹出/对话框,其中包含一个编辑文本). 就我个人而言,我发现完全动态的路线在创造力方面有一定的限制。

完全自定义对话框布局: < br >
而不是完全依赖 代码来创建对话框,你可以像这样完全自定义它: < br >
创建一个新的Layout Resource文件。这将作为你的对话框,允许充分的创作自由!< br > 注意:参考材料设计指南,以帮助保持整洁和要点
2),给你所有的View元素ID ..在下面的示例代码中,我有1 EditText和2 Buttons.

3) -Button创建一个Activity,用于测试。我们会让它膨胀并启动你的对话框!< br >

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
}

< br >

小菜一碟!充分的创作自由!只要确保遵循Material Guidelines;)

我希望这能帮助到一些人!告诉我你们的想法!

这是我的工作

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();
}

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

showForgotDialog (current_activity_name.this);

它是@Studio2bDesigns的回答的Kotlin实现,它提供了通过自定义布局创建文本输入对话框的能力。我用它来设置对话框,所以这就是为什么我使用不同的变量名。

val alertDialog = AlertDialog.Builder(this).create()
val settingsBinding = SettingsDialogBinding.inflate(layoutInflater) // SettingsDialogBinding provided by View binding
alertDialog.setView(settingsBinding.root)


settingsBinding.etLink.setText("Some text here")


settingsBinding.btnSave.setOnClickListener {
if (settingsBinding.etLink.text.toString().isNotBlank()) {
Toast.makeText(this, "You entered a Value!", Toast.LENGTH_LONG).show()
} else {
Toast.makeText(this, "Please enter a Value!", Toast.LENGTH_LONG).show()
}
}
settingsBinding.btnCancel.setOnClickListener {
alertDialog.dismiss() // close the dialog
}


alertDialog.show()