2011-02-06 13 views
9

Sto lavorando su un piccolo programma e ho bisogno di aggiungere una finestra di dialogo personalizzata che trasmetta alcune informazioni all'active di chiamata quando si chiude. Ho esteso la classe di dialogo, e quando provo ad acquisire la finestra di dialogo personalizzata quando si chiude, utilizzando un listener onDismiss, non la raggiungo mai perché ho usato una finestra di dialogo personalizzata.Impossibile utilizzare onDismiss() quando si utilizzano finestre di dialogo personalizzate - Android

Questo fa parte della mia attività -

. 
    . 
    . 
     attributes customizeDialog = new attributes(con,position,pick.getLastVisiblePosition()); 
     customizeDialog.show(); 

(Gli attributi è il nome della classe che estende la classe finestra di dialogo).

Ecco il listener di eventi ho creato quando la finestra di finiture -

customizeDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 

     @Override 
     public void onDismiss(DialogInterface dialog) { 
      Log.v("LOG_CAT",attributes.selectedIndexes.get(0) + " " + attributes.selectedIndexes.get(1) + " " + attributes.selectedIndexes.get(2) + " " + attributes.selectedIndexes.get(3) + " " + attributes.selectedIndexes.get(5) + " "); 
    } 

}); 

so che sto facendo male, solo che non so come risolvere il problema.

Apprezzerei davvero qualsiasi aiuto con questo problema.

Grazie!

+1

Ti manca una chiamata a un metodo super da qualche parte nella tua classe di dialogo personalizzata? Questo è il solito colpevole quando non si verifica un evento che ti aspetti in una classe personalizzata. –

+0

Hey Tofira Ho usato lo stesso codice che hai usato e funziona perfettamente. Forse hai perso qualcos'altro? –

risposta

16

Tendo ad avere la mia attività implementare ascoltatori come questo ...

public class MyActivity extends Activity 
    implements DialogInterface.OnDismissListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     attributes customizeDialog = new attributes(con,position,pick.getLastVisiblePosition()); 
     customizeDialog.setOnDismissListener(this); 
     customizeDialog.show(); 
    } 

    @Override 
    public void onDismiss(DialogInterface dialog) { 
     // Do whatever 
    } 
} 
+2

Non pensi che dovrebbe essere DialogInterface.OnDismissListener – TRonZ

+0

@TRonZ: Ooops sì, quello era un errore di battitura. È buffo che ci sia voluto quasi un anno e mezzo per essere notato da qualcuno. Lo correggerò. – Squonk

+0

In realtà stavo cercando di implementare il codice nella mia app, ecco perché l'ho capito. – TRonZ

5

Si potrebbe avere la vostra attività chiamata implementare un'interfaccia listener personalizzato che viene chiamato quando la finestra di dialogo si chiude:

public interface MyDialogListener { 
    void OnCloseDialog(); 
} 

public class MyActivity implements MyDialogListener { 
    public void SomeMethod() { 
     MyDialog myDialog = new MyDialog(this, this); 
     myDialog.show(); 
    } 

    public void OnCloseDialog() { 
     // Do whatever you want to do on close here 
    } 

} 

public class MyDialog extends Dialog { 
    MyDialogListener mListener; 

    public MyDialog (Context context, MyDialogListener listener) { 
     super(context, R.style.Dialog); 
     mListener = listener; 
    } 

    public void onClick(View view) { 
     switch (view.getId()) { 
      case R.id.CloseButton: 
       mListener.OnCloseDialog(); 
       dismiss() 
       break; 
      default: 
       //... 
     } 
    } 
} 

Ciò è particolarmente utile se si desidera inviare materiale al chiamante in qualsiasi altro momento, oltre al licenziamento.

0

Una cosa da ricordare è che un OnDismissListener sta ascoltando il licenziamento dei processi figli. Il genitore della finestra di dialogo del cliente ha bisogno del onDismissListener, non della finestra di dialogo stessa.

"Interfaccia utilizzata per consentire al creatore di una finestra di dialogo di eseguire codice quando la finestra di dialogo viene chiusa."

1

E se si vuole avere una sorta di salvare all'interno della finestra di dialogo, ancora una volta, è necessario utilizzare onDicmissListener dal momento che per finestre di dialogo personalizzate onDismiss non viene chiamato per impostazione predefinita:

public class CustomDialog extends Dialog implements DialogInterface.OnDismissListener { 

    public CustomDialog(Context context) { 
     super(context); 
     setupLayout(context); 
    } 

    public CustomDialog(Context context, int theme) { 
     super(context, theme); 
     setupLayout(context); 
    } 

    protected CustomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) { 
     super(context, cancelable, cancelListener); 
     setupLayout(context); 
    } 

    private void setupLayout(Context context) { 
     this.context = context; 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.custom_dialog); 
     WindowManager.LayoutParams params = getWindow().getAttributes(); 
     params.width = WindowManager.LayoutParams.FILL_PARENT; 
     getWindow().setAttributes(params); 

     setOnDismissListener(this); 

     loadPreferences(); 
    } 

    private void loadPreferences() { 
     // ... 
    } 

    private void savePreferences() { 
     // ... 
    } 

    @Override 
    public void onDismiss(DialogInterface dialogInterface) { 
     savePreferences(); 
    } 
} 
0

Per aggiungere dialogo all'interno della classe CustomDialog:

Problemi correlati