Wenn ein Benutzer in meiner App auf eine Button
klickt (die in einer SurfaceView
gedruckt ist), möchte ich, dass ein Text Dialog
angezeigt wird, und ich möchte das Ergebnis in einer String
speichern. Ich möchte, dass der Text Dialog
den aktuellen Bildschirm überlagert. Wie kann ich das machen?
Klingt nach einer guten Gelegenheit, einen AlertDialog zu verwenden.
So grundlegend es scheint, hat Android keinen eingebauten Dialog (soweit ich weiß). Glücklicherweise ist es nur eine kleine zusätzliche Arbeit, zusätzlich zum Erstellen eines Standard-AlertDialogs. Sie müssen lediglich einen EditText für den Benutzer erstellen, um Daten einzugeben, und ihn als Ansicht des AlertDialogs festlegen. Sie können den zulässigen Eingabetyp mithilfe von setInputType anpassen, falls erforderlich.
Wenn Sie eine Membervariable verwenden können, können Sie die Variable einfach auf den Wert von EditText setzen. Diese Variable bleibt erhalten, nachdem der Dialog geschlossen wurde. Wenn Sie keine Mitgliedsvariable verwenden können, müssen Sie möglicherweise einen Listener verwenden, um den Zeichenfolgenwert an die richtige Stelle zu senden. (Ich kann mehr bearbeiten und ausarbeiten, wenn Sie das brauchen).
Innerhalb Ihrer Klasse:
private String m_Text = "";
Innerhalb des OnClickListener Ihrer Schaltfläche (oder in einer von dort aufgerufenen Funktion):
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();
Ich werde das Update von @Aaron mit einem Ansatz aktualisieren, der Ihnen die Möglichkeit gibt, den Dialog besser zu gestalten. Hier ist ein angepasstes Beispiel:
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();
Hier ist ein Beispiel für das Layout, das zum Erstellen des EditText-Dialogfelds verwendet wurde:
<?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>
Hier finden Sie das Ergebnis:
Wie wäre es mit diesem BEISPIEL ? Es scheint einfach zu sein.
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();
Ich fand es sauberer und wiederverwendbar, AlertDialog.Builder
zu erweitern, um eine benutzerdefinierte Dialogklasse zu erstellen. Dies ist für ein Dialogfeld, in dem der Benutzer aufgefordert wird, eine Telefonnummer einzugeben. Eine voreingestellte Telefonnummer kann auch durch Aufrufen von setNumber()
bereitgestellt werden, bevor show()
aufgerufen wird.
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>
Verwendungszweck:
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();
@LukeTaylor: Ich habe momentan die gleiche Aufgabe (Erstellen eines Popup/Dialogs, der einen EditText enthält).
Ich persönlich finde die volldynamische Route in Bezug auf Kreativität etwas einschränkend.
VOLLSTÄNDIGE ANPASSUNG DES DIALOGS:
Anstatt vollständig auf Code zu setzen, um den Dialog zu erstellen, können Sie ihn wie folgt anpassen:
1) - / Erstellen Sie eine neue Layout Resource
-Datei. Diese wird als Ihr Dialog fungieren und bietet Ihnen volle kreative Freiheit!
HINWEIS: Beachten Sie die Richtlinien zum Materialdesign, um die Dinge sauber und punktgenau zu halten.
2) - Geben Sie allen Ihren View
-Elementen IDs. In meinem folgenden Beispielcode habe ich 1 EditText
und 2 Buttons
.
3) - Erstellen Sie zum Testen eine Activity
mit einer Button
. Wir werden es aufblasen lassen und Ihren Dialog starten!
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
}
Stück Kuchen! Volle kreative Freiheit! Befolgen Sie einfach die Materialrichtlinien;)
Ich hoffe das hilft jemandem! Lassen Sie mich wissen, was Sie denken!
Wenn Sie bei left
und right
der input
-Ansicht etwas Platz benötigen, können Sie etwas Auffüllen hinzufügen
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>
Ich hoffe es hilft