Ввод текстового диалога Android

Когда пользователь нажимаетButton в моем приложении (которое печатается вSurfaceView), Мне нравится текстDialog появляться, и я хотел бы сохранить результат вString, Мне нравится текстDialog наложить текущий экран. Как я могу это сделать?

Ответы на вопрос(6)

у меня сейчас та же задача под рукой (создание всплывающего окна / диалогового окна, содержащего EditText) ..
Лично я считаю, что полностью динамический маршрут несколько ограничивает с точки зрения креативности.

FULLY CUSTOM DIALOG LAYOUT :

Rather than relying entirely upon Code to create the Dialog, you can fully customize it like so :

1) - Создать новыйLayout Resource файл .. Это будет действовать как ваш диалог, предоставляя полную свободу творчества!
ПРИМЕЧАНИЕ. См. Рекомендации по проектированию материалов, чтобы обеспечить чистоту и актуальность.

2) - Дайте удостоверения личности всем вашимView элементы .. В моем примере кода ниже, у меня есть 1EditTextи 2Buttons.

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
}


Кусок пирога! Полная творческая свобода! Просто убедитесь, что вы следуете Материальным правилам;)

I hope this helps someone! Дайте мне знать, что вы, ребята, думаете!

 19 янв. 2019 г., 21:34
Просто любопытно, почему (-1) понизить? Предоставленная мною логика работает точно так, как задумывалось и как описано. Я чувствовал, что это хорошее дополнение к этому посту, о котором еще не было упомянуто, и которое является совершенно разумным альтернативным решением.HoweverЕсли у вас есть уважительная причина для опровержения предоставленной мною информации, было бы немного полезнее, если бы вы предоставили некоторый контекст для того, почему вы это сделали, чтобы я и другие могли выучить и понять причину. Фактически отрицательные голоса могут быть очень полезными и полезно в процессе обучения - но только тогда, когда за этим стоит контекст.

ПРИМЕР? Это кажется простым.

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(); 
 15 сент. 2016 г., 22:54
Примерно так же, как Аарон, но цепляет строителя. Дело в личных предпочтениях, так как оба работают нормально.

left а такжеright изinput посмотреть, вы можете добавить некоторые отступы, как

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>

Надеюсь, это поможет

Решение Вопроса

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();
 09 нояб. 2014 г., 15:02
Я думаю, что вместо создания глобальной переменной для контекста, вы можете передать контекст следующим образом: & quot; MainActivity.this & quot; (вам нужно заменить текст «MainActivity» на имя класса активности, которое вы хотите использовать).
 18 июн. 2012 г., 16:20
Ой. Если вы работаете с потоком, попробуйте поместить builder.show (); вызов с runOnUiThread, подобный этому примеру:stackoverflow.com/a/3134720/1098302 Или, может быть, было бы лучше поместить весь приведенный выше код (который создает AlertDialog) в отдельный метод и вызывать этот метод из runOnUiThread.
 Luke Taylor16 июн. 2012 г., 11:39
У меня есть поток, который постоянно обновляет и отображает экранный объект, и я вызываю метод builder.show () в методе обновления экранного объекта.
 17 окт. 2013 г., 18:06
Спасибо. Это хорошо. Однако есть небольшая проблема. Нужно объявитьglobal Context, Context cont; а затем замените «это» в алертиддиалог поcont, AlertDialog.Builder builder = новый AlertDialog.Builder (продолжение); окончательный ввод EditText = новый EditText (продолжение);
 09 июл. 2016 г., 02:15
Стоит отметить, что, как и в большинстве Android-интерфейсов, все это асинхронно ... это означает, что он не будет ждать, пока пользователь нажмет OK, если у вас нет чего-то, что делает этот шаг следующим шагом ...

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

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>

Usage:

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

который даст вам возможность лучше стилизовать диалоги. Вот приведенный пример:

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

 20 мая 2017 г., 09:17
@JPerk: android.R.id.content дает корневой элемент представления. Порекомендуйте это, пожалуйста:stackoverflow.com/a/12887919/1911652
 27 сент. 2016 г., 19:24
Не забудьте привести этот findViewById к(ViewGroup)!
 15 апр. 2017 г., 00:06
& quot; Элемент AutoCompleteTextView здесь не разрешен ... & quot;
 26 янв. 2017 г., 11:20
Если вы вызываете Inflater с последним аргументом false, зачем использовать второй параметр? Если я понимаю, если правильно, это используется, только если установлено значение true.
 10 июн. 2016 г., 13:04
Отличное решение! Я только заменилgetView() сfindViewById(android.R.id.content)и все это работало как шарм. Большое спасибо за обмен :)

Ваш ответ на вопрос