it-swarm.com.de

Eingabetext-Dialog Android

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?

235
Luke Taylor

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

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:

 EditText Dialog example

76
Michal

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

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();
2
Magnus W

@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!

1
Studio2bDesigns

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

1
Linh