Cómo hacer un cuadro de edición de texto en un diálogo

211

Estoy tratando de hacer un cuadro de edición de texto en un cuadro de diálogo para ingresar una contraseña. y cuando estoy haciendo no puedo hacerlo. Soy un principiante en eso. Por favor, ayúdame en esto.

public class MainActivity extends Activity {

Button create, show, setting;
//String pass="admin";String password;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    create = (Button)findViewById(R.id.amcreate);
    setting = (Button)findViewById(R.id.amsetting);
    show = (Button)findViewById(R.id.amshow);
    //input = (EditText)findViewById(R.id.this);

    setting.setVisibility(View.INVISIBLE);

    create.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            Intent myIntent1 = new Intent(view.getContext(), Create.class);
            startActivityForResult(myIntent1, 0);
        }

    });

    show.setOnClickListener(new View.OnClickListener() {
        //@SuppressWarnings("deprecation")
        public void onClick(final View view) {

            // Creating alert Dialog with one Button
            AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);

            //AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();

            // Setting Dialog Title
            alertDialog.setTitle("PASSWORD");

            // Setting Dialog Message
            alertDialog.setMessage("Enter Password");
            **final EditText input = new EditText(this);**
            //alertDialog.setView(input);

            // Setting Icon to Dialog
            alertDialog.setIcon(R.drawable.key);

            // Setting Positive "Yes" Button
            alertDialog.setPositiveButton("YES",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog,int which) {
                            // Write your code here to execute after dialog
                            Toast.makeText(getApplicationContext(),"Password Matched", Toast.LENGTH_SHORT).show();
                            Intent myIntent1 = new Intent(view.getContext(), Show.class);
                            startActivityForResult(myIntent1, 0);
                        }
                    });
            // Setting Negative "NO" Button
            alertDialog.setNegativeButton("NO",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            // Write your code here to execute after dialog
                            dialog.cancel();
                        }
                    });

            // closed

            // Showing Alert Message
            alertDialog.show();
        }

    }); 

Imagen

ingrese la descripción de la imagen aquí

Quiero llegar como

ingrese la descripción de la imagen aquí

 AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this);
 alertDialog.setTitle("PASSWORD");
 alertDialog.setMessage("Enter Password");

 final EditText input = new EditText(MainActivity.this);
 LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
     LinearLayout.LayoutParams.MATCH_PARENT,
     LinearLayout.LayoutParams.MATCH_PARENT);
 input.setLayoutParams(lp);
 alertDialog.setView(input);
 alertDialog.setIcon(R.drawable.key);

 alertDialog.setPositiveButton("YES",
     new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
             password = input.getText().toString();
             if (password.compareTo("") == 0) {
                 if (pass.equals(password)) {
                     Toast.makeText(getApplicationContext(),
                         "Password Matched", Toast.LENGTH_SHORT).show();
                     Intent myIntent1 = new Intent(view.getContext(),
                         Show.class);
                     startActivityForResult(myIntent1, 0);
                 } else {
                     Toast.makeText(getApplicationContext(),
                         "Wrong Password!", Toast.LENGTH_SHORT).show();
                 }
             }
         }
     });

 alertDialog.setNegativeButton("NO",
     new DialogInterface.OnClickListener() {
         public void onClick(DialogInterface dialog, int which) {
             dialog.cancel();
         }
     });

 alertDialog.show();
 }

 });
Tejido
fuente
1
consulte este developer.android.com/guide/topics/ui/notifiers/toasts.html . Verifique las tostadas de posicionamiento. Pero supongo que es mejor para setError EditarTexto
Raghunandan

Respuestas:

171

Usar contexto de actividad

Reemplace esto

  final EditText input = new EditText(this);

Por

  final EditText input = new EditText(MainActivity.this);  
  LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                        LinearLayout.LayoutParams.MATCH_PARENT,
                        LinearLayout.LayoutParams.MATCH_PARENT);
  input.setLayoutParams(lp);
  alertDialog.setView(input); // uncomment this line
Raghunandan
fuente
1
@Abhishek wher es tu inicialización. Al igual Dialog dialog = new Dialog(MainActivity.this). Creo que copiaste tu código de otro lugar donde supongo
Raghunandan
1
@Abhishek, perdón mi confusión, pensó que tenías un diálogo personalizado. public void onClick(DialogInterface dialogEs la interfaz de diálogo. usando eso no es un problema, haga clic en el botón negativo para cerrar el diálogo de alerta.
Raghunandan
1
@Abhishek muestra un mensaje brindis o establece un error para editar el texto. stackoverflow.com/questions/7747268/…
Raghunandan
1
Toast toast = Toast.makeText (MainActivity.this, "¡Ingrese la contraseña!", Toast.LENGTH_LONG); toast.setGravity (Gravity.CENTER, 0, 0); tostada.show (); Esto funcionó para mí para poner la tostada en el centro.
Abb
55
Hola Raghu, si quiero poner margen izquierdo y margen derecho en este cuadro de edición de texto, ¿qué debo escribir? Intenté muchas respuestas, para establecer el margen mediante programación, pero nada funcionó :(
Lucifer
287

Sé que es demasiado tarde para responder esta pregunta, pero para otros que están buscando algo similar a esto aquí hay un código simple de un cuadro de alerta con un texto de edición

AlertDialog.Builder alert = new AlertDialog.Builder(this); 

o

new AlertDialog.Builder(mContext, R.style.MyCustomDialogTheme);

si quieres cambiar el tema del diálogo.

final EditText edittext = new EditText(ActivityContext);
alert.setMessage("Enter Your Message");
alert.setTitle("Enter Your Title");

alert.setView(edittext);

alert.setPositiveButton("Yes Option", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        //What ever you want to do with the value
        Editable YouEditTextValue = edittext.getText();
        //OR
        String YouEditTextValue = edittext.getText().toString();
    }
});

alert.setNegativeButton("No Option", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
        // what ever you want to do with No option.
    }
});

alert.show();
Syeda Zunaira
fuente
¿Dónde debo colocar este código? Cuando intenté esto en el método, y el campo final EditText colocado en la parte superior de la clase, se bloquea.
cerbin
¿Cuál es el accidente?
Syeda Zunaira
10
¿Cómo dar margen a este EditText?
Ghanshyam Nayma
1
Buena sugerencia del tema solicitado, pero se necesita un comentario de estilo. Android no es Windows, y no hay necesidad de un botón de cancelar, ya que es imprescindible en Win32, existe el botón "Atrás" del sistema operativo que sirve como Cancelar / No. Por lo tanto, mi sugerencia es omitir el botón negativo en un cuadro de diálogo de solicitud de contraseña, y el botón positivo no debe ser "Sí", sino que debe ser "OK" (y localizarlo usando android.R.string.ok). Vea más en mi respuesta sobre el tema stackoverflow.com/questions/11459827/… .
Jan Bergström
2
El campo de edición también debe ser un trazador de líneas (edittext.setSingleLine ();) en una solicitud de contraseña (porque lo es) y eso hace que presionar enter en un teclado físico (BT) adjunto (o un Chromebook) haciendo que el foco salte al siguiente elemento, el botón positivo. lo que significa que después de ingresar el texto, presionar enter dos veces el diálogo finaliza positivamente.
Jan Bergström
36

Lo más simple de todo sería.

  • Crear archivo de diseño xml para el diálogo. Agregue la vista que desee, como EditText, ListView, Spinner, etc.

    Infle esta vista y establezca esto en AlertDialog

Comencemos primero con el archivo de diseño.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center_horizontal"
    android:orientation="vertical">


    <EditText
        android:id="@+id/etComments"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="top"
        android:hint="Enter comments(Optional)"
        android:inputType="textMultiLine"
        android:lines="8"
        android:maxLines="3"
        android:minLines="6"
        android:scrollbars="vertical" />

</LinearLayout>

final View view = layoutInflater.inflate(R.layout.xml_file_created_above, null);
AlertDialog alertDialog = new AlertDialog.Builder(ct).create();
alertDialog.setTitle("Your Title Here");
alertDialog.setIcon("Icon id here");
alertDialog.setCancelable(false);
Constant.alertDialog.setMessage("Your Message Here");


final EditText etComments = (EditText) view.findViewById(R.id.etComments);

alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {

    }
});


alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "Cancel", new OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog, int which) {
        alertDialog.dismiss()
    }
});


alertDialog.setView(view);
alertDialog.show();
Balwinder SIngh
fuente
3
Que héroe eres.
AdamMcquiff
Me estrello Encontré la razón por la que me caí porque me perdí la 'vista' en findViewById. Ahora solo necesito saber cómo manejar una casilla de verificación para poder mostrar u ocultar la contraseña MIENTRAS el cuadro de diálogo aún está activo. Probé el enfoque de elementos múltiples, pero agregó su propia casilla de verificación además de la de mi diseño.
Brian Reinhold
24

Versión simplificada

final EditText taskEditText = new EditText(this);
AlertDialog dialog = new AlertDialog.Builder(this)
        .setTitle("Add a new task")
        .setMessage("What do you want to do next?")
        .setView(taskEditText)
        .setPositiveButton("Add", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                String task = String.valueOf(taskEditText.getText());
                SQLiteDatabase db = mHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put(TaskContract.TaskEntry.COL_TASK_TITLE, task);
                db.insertWithOnConflict(TaskContract.TaskEntry.TABLE,
                        null,
                        values,
                        SQLiteDatabase.CONFLICT_REPLACE);
                db.close();
                updateUI();
            }
        })
        .setNegativeButton("Cancel", null)
        .create();
dialog.show();
return true;
Swarathesh Addanki
fuente
12

Pruebe el siguiente código:

alert.setTitle(R.string.WtsOnYourMind);

 final EditText input = new EditText(context);
 input.setHeight(100);
 input.setWidth(340);
 input.setGravity(Gravity.LEFT);

 input.setImeOptions(EditorInfo.IME_ACTION_DONE);
 alert.setView(input);
Pratik Dasa
fuente
5

Establecer margen en los parámetros de diseño no funcionará en Alertdialog. debe configurar el relleno en el diseño principal y luego agregar edittext en ese diseño.

Este es mi código kotlin de trabajo ...

val alert =  AlertDialog.Builder(context!!)

val edittext = EditText(context!!)
edittext.hint = "Enter Name"
edittext.maxLines = 1

val layout = FrameLayout(context!!)

//set padding in parent layout
layout.setPaddingRelative(45,15,45,0)

alert.setTitle(title)

layout.addView(edittext)

alert.setView(layout)

alert.setPositiveButton(getString(R.string.label_save), DialogInterface.OnClickListener {

    dialog, which ->
    run {

        val qName = edittext.text.toString()

        Utility.hideKeyboard(context!!, dialogView!!)

    }

})
alert.setNegativeButton(getString(R.string.label_cancel), DialogInterface.OnClickListener {

            dialog, which ->
            run {
                dismiss()
            }

})

alert.show()
Wasim K. Memon
fuente
4

También puede crear un cuadro de diálogo de alerta personalizado creando un archivo xml.

dialoglayout.xml

   <EditText
    android:id="@+id/dialog_txt_name"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="10dp"
    android:hint="Name"
    android:singleLine="true" >

    <requestFocus />
  </EditText>
   <Button
        android:id="@+id/btn_login"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="60dp"
        android:background="@drawable/red"
        android:padding="5dp"
        android:textColor="#ffffff"
        android:text="Submit" />

    <Button
        android:id="@+id/btn_cancel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/btn_login"
        android:background="@drawable/grey"
        android:padding="5dp"
        android:text="Cancel" />

El código de Java:

@Override//to popup alert dialog
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    showDialog(DIALOG_LOGIN);
});


@Override
protected Dialog onCreateDialog(int id) {
    AlertDialog dialogDetails = null;

    switch (id) {
        case DIALOG_LOGIN:
            LayoutInflater inflater = LayoutInflater.from(this);
            View dialogview = inflater.inflate(R.layout.dialoglayout, null);
            AlertDialog.Builder dialogbuilder = new AlertDialog.Builder(this);
            dialogbuilder.setTitle("Title");
            dialogbuilder.setView(dialogview);
            dialogDetails = dialogbuilder.create();
            break;
    }
    return dialogDetails;
}

@Override
protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
        case DIALOG_LOGIN:
             final AlertDialog alertDialog = (AlertDialog) dialog;
             Button loginbutton = (Button) alertDialog
                .findViewById(R.id.btn_login);
             Button cancelbutton = (Button) alertDialog
                .findViewById(R.id.btn_cancel);
             userName = (EditText) alertDialog
                .findViewById(R.id.dialog_txt_name);
             loginbutton.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View v) {
                      String name = userName.getText().toString();
                      Toast.makeText(Activity.this, name,Toast.LENGTH_SHORT).show();
             });
             cancelbutton.setOnClickListener(new View.OnClickListener() {
                      @Override
                      public void onClick(View v) {
                           alertDialog.dismiss();
                      }
             });
             break;
   }
}
Sombra
fuente
esto es lo que necesitaba, pero ¿cómo puedo usar esto en su fragmento de muestra de error
Raju
0

La respuesta de Wasim me llevó en la dirección correcta, pero tuve que hacer algunos cambios para que funcionara en mi proyecto actual. Estoy usando esta función en un fragmento y llamándola al hacer clic en el botón.

fun showPostDialog(title: String) {
        val alert =  AlertDialog.Builder(activity)

        val edittext = EditText(activity)
        edittext.hint = "Enter Name"
        edittext.maxLines = 1

        var layout = activity?.let { FrameLayout(it) }

        //set padding in parent layout
//        layout.isPaddingRelative(45,15,45,0)
        layout?.setPadding(45,15,45,0)

        alert.setTitle(title)

        layout?.addView(edittext)

        alert.setView(layout)

        alert.setPositiveButton(getString(R.string.label_save), DialogInterface.OnClickListener {

                dialog, which ->
            run {

                val qName = edittext.text.toString()

                showToast("Posted to leaderboard successfully")

                view?.hideKeyboard()

            }

        })
        alert.setNegativeButton(getString(R.string.label_cancel), DialogInterface.OnClickListener {

                dialog, which ->
            run {
                dialog.dismiss()
            }

        })

        alert.show()
    }

    fun View.hideKeyboard() {
        val imm = context.getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
        imm.hideSoftInputFromWindow(windowToken, 0)
    }

    fun showToast(message: String) {
        Toast.makeText(activity, message, Toast.LENGTH_LONG).show()
    }

Espero que ayude a alguien más en el futuro cercano. ¡Feliz codificación!

thesamoanppprogrammer
fuente