2013-02-12 1 views
10

Ho un'applicazione con un AlertDialog che mostra un singolo EditText. Ho seguito la guida degli sviluppatori Android per farlo, ma non riesco a trovare come ottenere i dati inseriti dall'utente.Android AlertDialog con visualizzazione personalizzata: ottieni dati di input

Il layout personalizzato Basta un EditText:

<EditText 
    android:id="@+id/license_value" 
    android:inputType="text" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:hint="@string/license" /> 

sto usando un DialogFragment per creare la finestra di dialogo. Per recuperare i dati quando l'utente fa clic sul pulsante OK, sto utilizzando un'interfaccia.

public class EditLicenseDialogFragment extends DialogFragment { 

    public interface EditLicenseDialogListener { 
     public void onDialogPositiveClick(DialogFragment dialog, String value); 
    } 

    private EditLicenseDialogListener mListener; 

    // Override the Fragment.onAttach() method to instantiate the NoticeDialogListener 
    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     // Verify that the host activity implements the callback interface 
     try { 
      // Instantiate the NoticeDialogListener so we can send events to the host 
      mListener = (EditLicenseDialogListener) activity; 
     } catch (ClassCastException e) { 
      // The activity doesn't implement the interface, throw exception 
      throw new ClassCastException(activity.toString() 
        + " must implement NoticeDialogListener"); 
     } 
    } 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     // Use the Builder class for convenient dialog construction 
     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

     builder.setTitle(R.string.new_license); 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 

     builder.setView(inflater.inflate(R.layout.edit_license, null)) 

     .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int id) { 
         // GET VALUE. HOW TO DO IT? 
       EditText valueView = (EditText) getActivity().findViewById(R.id.license_value); 
       if(valueView == null) Log.d("AA", "NULL"); 
       else{ 
        String value = valueView.getText().toString(); 
        mListener.onDialogPositiveClick(EditLicenseDialogFragment.this, value); 
       } 
      }) 
     .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int id) { 
       EditLicenseDialogFragment.this.getDialog().cancel(); 
      } 
     }); 

     return builder.create(); 

    } 
} 

Nella mia attività faccio la seguente:

public class LicenseListActivity extends FragmentActivity 
    implements EditLicenseDialogFragment.EditLicenseDialogListener{ 

    ... 

    findViewById(R.id.buttonAddLicense).setOnClickListener(
      new View.OnClickListener() { 
       public void onClick(View view) { 
        DialogFragment dialog = new EditLicenseDialogFragment(true); 
        dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment"); 
       } 
      }); 

    @Override 
    public void onDialogPositiveClick(DialogFragment dialog, String value) { 
     Log.d("TAG", value); 
    } 

L'EditText cerco di recuperare all'interno del DialogFragment è sempre NULL. Come posso ottenere il valore di EditText?

Grazie!

risposta

21

Penso che sia perché la vista in cui si sta cercando di trovare il proprio edittext non è corretta.

dovrebbe essere qualcosa di simile:

LayoutInflater inflater = getActivity().getLayoutInflater(); 

View dialogView = inflater.inflate(R.layout.edit_license, null); 
builder.setView(dialogView) 
.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int id) { 

      EditText valueView = (EditText) dialogView.findViewById(R.id.license_value); //here 
      if(valueView == null) Log.d("AA", "NULL"); 
      else{ 
       String value = valueView.getText().toString(); 
       mListener.onDialogPositiveClick(EditLicenseDialogFragment.this, value); 
      } 
     }) 
+0

che è stato. Grazie! –

+0

Ho provato questo, ma sulla riga, dove valueView è inizializzato, il compilatore mi dà un errore: "Impossibile riferirsi a una variabile non finale diag_view all'interno di una classe interna definita in un metodo diverso". Se faccio dialogView una variabile finale, non sarà cambiato e nulla può essere recuperato da esso. – jerryh91

+0

Quindi, dichiarare 'View dialogView' al di fuori di un metodo, come un campo di classe. –