2012-08-24 11 views
7

Ho frammento che estende DialogFragment e ho un layout personalizzato che contiene due edittexts e due pulsanti - ok e annulla. La mia finestra di dialogo viene visualizzata correttamente, utilizzando il metodo onCreateView per specificare il layout, ma non so come gestire i clic sui pulsanti. All'interno del metodo onCreateView, button.setOnClickListener non funziona. Questo potrebbe avere una soluzione semplice, ma sono bloccato per diverse ore. Gradirei molto un consiglio o un codice di esempio.handle button fa clic in un DialogFragment

PS Non voglio usare AlertDialog, perché in questo caso quando si fa clic sul pulsante ok, la finestra di dialogo si chiude automaticamente, e non posso fare una convalida sul edittext (esempio: quando l'utente preme OK pulsante e le edittext sono vuote. Non voglio che la finestra di dialogo scompaia). Questo è il modo in cui sono andato con l'opzione per la creazione di una finestra di dialogo personalizzata e gestire facilmente il comportamento dei pulsanti.

risposta

5

fare lungo queste linee

Dialog dl = mDialogFragment.getDialog(); 
Button btn = dl.findViewbyid(R.id.btn); 
btn.setOnclicklistener(this); 
+1

Grazie. Ho già trovato una soluzione come questa. \t \t \t \t buttonOk.setOnClickListener (nuova View.OnClickListener() { \t @Override \t public void onClick (Panorama vista) { \t \t \t \t \t}} \t \t}); ma forse anche la tua soluzione funziona. Thx comunque! – Sandra

9

Questo è il codice per una finestra di dialogo che sto utilizzando (la GUI effettivo per il dialogo è definita nel confirm_dialog.xml risorsa di layout):

public class ConfirmDialog extends DialogFragment { 

    public static String TAG = "Confirm Dialog"; 

    public interface ConfirmDialogCompliant { 
     public void doOkConfirmClick(); 
     public void doCancelConfirmClick(); 
    } 

    private ConfirmDialogCompliant caller; 
    private String message; 

    public ConfirmDialog(ConfirmDialogCompliant caller, String message){ 
     super(); 
     this.caller = caller; 
     this.message = message; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.confirm_dialog, container, false); 
     getDialog().requestWindowFeature(Window.FEATURE_NO_TITLE); 
     ((TextView) view.findViewById(R.id.textview_confirm)).setText(message); 
     ((Button) view.findViewById(R.id.ok_confirm_button)).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       caller.doOkConfirmClick(); 
      } 
     }); 
     ((Button) view.findViewById(R.id.cancel_confirm_button)).setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       // When button is clicked, call up to owning activity. 
       caller.doCancelConfirmClick(); 
      } 
     }); 
     return view; 
    } 

} 

La finestra di dialogo viene creato con le seguenti righe

confirm_dialog = new ConfirmDialog(this, message); 
confirm_dialog.show(getActivity().getSupportFragmentManager(), ConfirmDialog.TAG); 

La definizione di interfaccia viene utilizzato come certo che il chiamante (Fragment o Activity) implementa i metodi per gestire gli eventi lanciati dal controller. Cioè, un frammento o attività che chiama questa finestra di dialogo deve implementare l'interfaccia specificata.
Forse c'è una soluzione migliore ma questo è quello che ho capito. Spero che sia d'aiuto!

+0

impostazione onClickListener come questo non ha funzionato per me. Mi ha dato errori. Ho trovato una soluzione al mio problema e l'ho scritto come commento alla prima risposta. Grazie per la tua risposta comunque. – Sandra

+0

Funziona se si gonfia il layout da una risorsa xml. Se stai creando il layout a livello di codice, devi chiamare setOnClickListener sul tuo riferimento Button. –

+0

Sì, ho anche gonfiato un layout da una risorsa xml nel metodo onCreateView. Il problema che stavo riscontrando era: myButton.setOnClickListener (nuovo OnClickListener() {} mi dava un errore, quindi la soluzione stava usando myButton.setOnClickListener (nuovo View.OnClickListener() {}. Non so perché non riconoscere il mio ascoltatore in quel modo, ma lo ha fatto .. – Sandra

8

Ecco un esempio di un handel annullare pulsante di scatto su una finestra di dialogo dalla classe FragmentDialog:

ho usato android.support.v4.app.DialogFragment;

public class MyDialogFragment extends DialogFragment { 
    public MyDialogFragment(){}  
    public static String TAG = "info Dialog"; 
    Button btn; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     final View view = inflater.inflate(R.layout.info_layout, container); 
     getDialog().requestWindowFeature(STYLE_NO_TITLE); 
     btn=(Button)view.findViewById(R.id.close_dialog_btn_info_layout); 
     btn.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       getDialog().dismiss(); 
      } 
     }); 

     return view; 
    } 





} 
3

Un'altra opzione è quella di lasciare che la classe personalizzata DialogFragment implementare OnClickListener. Quindi ti basta setOnClickListener per qualsiasi visualizzazione desideri gestire clic e acquisire i clic in onClick.

// 1. implement OnClickListener 
public class MyDialogFragment extends DialogFragment implements View.OnClickListener { 

    @Override 
    public Dialog onCreateDialog(Bundle savedInstanceState) { 

     LayoutInflater inflater = getActivity().getLayoutInflater(); 
     View view = inflater.inflate(R.layout.my_dialog_layout, null); 

     // 2. set click listeners on desired views 
     view.findViewById(R.id.my_view_1).setOnClickListener(this); 
     view.findViewById(R.id.my_view_2).setOnClickListener(this); 


     AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
     builder.setView(view) 
       // ... 
     return builder.create(); 
    } 

    // 3. capture the clicks and respond depending on which view 
    @Override 
    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.my_view_1: 
       // do something 
       break; 
      case R.id.my_view_2: 
       // do something 
       break; 
      default: 
       break; 
     } 
    } 
} 
1

È facile in attività, ma in DialogFragment facciamo altri codici.

Ecco come ho risolto il mio problema, all'interno della classe o DialogFragment fare il vostro findView rutina

btn_ocak = (Button) view.findViewById(R.id.btn_cal_ocak); 
    btn_subat = (Button) view.findViewById(R.id.btn_cal_subat); 
    btn_mart = (Button) view.findViewById(R.id.btn_cal_mart); 
    btn_nisan = (Button) view.findViewById(R.id.btn_cal_nisan); 


btn_ocak.setOnClickListener(this); 
    btn_subat.setOnClickListener(this); 
    btn_mart.setOnClickListener(this); 
    btn_nisan.setOnClickListener(this); 

Implementare onClick OnClickListener alla classe

public class CalendarPopUp extends DialogFragment implements View.OnClickListener 

e fare ciò che si vuole all'interno metodo onClick, da facendo ciò abbiamo attivato gli eventi onClick delle nostre viste

@Override 
public void onClick(View view) { 
    switch (view.getId()) { 
     case R.id.btn_cal_ocak: 
      seciliAy = "Ocak"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_subat: 
      seciliAy = "Subat"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_mart: 
      seciliAy = "Mart"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_nisan: 
      seciliAy = "Nisan"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_mayis: 
      seciliAy = "Mayıs"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_haziran: 
      seciliAy = "Haziran"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_temmuz: 
      seciliAy = "Temmuz"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_agustos: 
      seciliAy = "Agustos"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_eylul: 
      seciliAy = "Eylül"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_ekim: 
      seciliAy = "Ekim"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_kasim: 
      seciliAy = "Kasım"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     case R.id.btn_cal_aralik: 
      seciliAy = "Aralık"; 
      setMonthOnShare(seciliAy); 
      mCallback.onSelectedData(seciliAy); 
      dismiss(); 
      break; 
     default: 
      break; 
    } 
} 

e se ti chiedi come passare i valori segui questo passaggio clike_here

Problemi correlati