2011-04-02 26 views
16

Tengo un cuadro de diálogo personalizado y cuando intento obtener el valor de EditText, devuelve nulo.findviewbyid devuelve nulo en un cuadro de diálogo

Esta línea devuelve null

EditText et = (EditText)findViewById(R.id.username_edit); 

Aquí está el código en su totalidad.

protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DIALOG_TEXT_ENTRY: 
     LayoutInflater factory = LayoutInflater.from(this); 
     final View textEntryView = factory.inflate(R.layout.alert_dialog_text_entry, null); 
     return new AlertDialog.Builder(TicTacToe.this) 
      //.setIconAttribute(android.R.attr.alertDialogIcon) 
      .setTitle(getTitleText()) 
      .setView(textEntryView) 
      .setPositiveButton("JOIN GAME", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int whichButton) { 
        try 
        { 
         EditText et = (EditText)findViewById(R.id.username_edit); 
          playerName = et.getText().toString(); 
        } 
        catch (Exception e) 
        { 
        } 
       } 
      }) 
      .create(); 
    } 
    return null; 
} 

Respuesta

36

Prueba esto:

EditText et = (EditText)textEntryView.findViewById(R.id.username_edit); 

usted tiene que decir en el que ver para encontrar el id. De lo contrario, tratará de encontrar el ID de la vista desde el diseño xml inflado por setContentView (normalmente declarada en onCreate)

+0

+1 Great work man. – Jacob

+0

gracias! también funciona para mí – Urbanleg

+0

Gracias salvaste el día :) – orchidrudra

2

que estaba teniendo el mismo problema, que se presentaba en el siguiente fragmento de código:

final Dialog dialog = new Dialog(this); 

dialog.setContentView(R.layout.addbank_dialog); 
dialog.show(); 

Button btnSaveBank = (Button)dialog.findViewById(R.id.btnSaveBank); 

final EditText etBankName = (EditText)dialog.findViewById(R.id.etBankName); 

btnSaveBank.setOnClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     try{ 
      String bank = etBankName.getText().toString(); 
      SharedCommonData.dbOps.saveBankInDB(bank); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
     Toast.makeText(SharedCommonData.context, "Bank Saved", Toast.LENGTH_SHORT); 
     refreshBanks(); 
     dialog.dismiss(); 
    } 
}); 

etBankName devolvía valor nulo, pero luego usé dialog.findviewbyid(R.id.etBankName) y funcionó.

20

En mi caso: primero tengo que llamar a la dialog.show

(),

y sólo después de que yo era capaz de utilizar

dialog.findviewById (R.id.miID).

Si me perdí al llamar al programa(), me devolví un nulo con findViewByID.

+1

Eso es totalmente contrario a lo que 'AlertDialog.Builder.create()' parece implicar, y también, totalmente correcto. De hecho, incluso si no desreferencia el nulo, el simple hecho de haber llamado 'findViewById' provocará una excepción diferente cuando finalmente llame a' show() '. Gracias. – benkc

+0

Eso es muy extraño ... y, por cierto, depende del dispositivo. He usado 'Dialog.findViewById()' antes de llamar a 'Dialog.show()' y funcionó. – Bondax

6

Me enfrenté a un problema similar. En mi caso, tuve un diálogo con diseño personalizado y en este diseño tenía un radioButton. Para resolver eso, utilicé el siguiente código:

View dialogLayout = factory.inflate(R.layout.dialog_layout, null); 
AlertDialog.Builder dialog = new AlertDialog.Builder(context); 
dialog.setView(dialogLayout); 

RadioButton radiobt = (RadioButton) dialogLayout.findViewById(R.id.radioBt); 
Cuestiones relacionadas