2011-09-25 14 views
8

scrivo una finestra di dialogo personalizzata e cercare di ottenere alcuni dati dalla sua attività principale, ma ho sempre ottenere nulla quando chiamo getOwnerActivity, qualcuno potrebbe dirmi il motivo per cui questo accade? Perché posso mostrare i dati nel DemoDialog mentre non riesco a mostrare i dati da TestDialogActivity?getOwnerActivity restituisce null nella finestra di dialogo personalizzata

Molte grazie in anticipo.

DialogTestActivity

public class DialogTestActivity extends Activity { 
    List<String> data = new ArrayList<String>(); 
    Button button; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     button = (Button)findViewById(R.id.button); 
     button.setOnClickListener(new OnClickListener(){ 
      public void onClick(View v) { 
       showDialog(0); 
      } 
     }); 
    } 

    public List<String> getData(){ 
     data.add("one"); 
     data.add("two"); 
     data.add("three"); 
     return data; 
    } 

    public Dialog onCreateDialog(int id){ 
     return new DemoDialog(this); 
    } 
} 

DemoDialog

public class DemoDialog extends Dialog { 
    Context context; 

    public DemoDialog(Context context) { 
     super(context); 
     setContentView(R.layout.dialog); 
     this.context = context; 
     setTitle("Delete City"); 
     ListView list = (ListView)findViewById(R.id.list); 
     ArrayAdapter<String> aa = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, ((DialogTestActivity)getOwnerActivity()).getData()); 
//  ArrayAdapter<String> aa = new ArrayAdapter<String>(context, android.R.layout.simple_list_item_multiple_choice, getData()); 
     list.setAdapter(aa); 
     list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 

    private List<String> getData(){ 
     List<String> data = new ArrayList<String>(); 
     data.add("1"); 
     data.add("2"); 
     return data; 
    } 
} 

risposta

5

Se si pensa alla situazione, si capisce perché. Quando chiami new DemoDialog(this), esegui tutto il codice nel costruttore. Successivamente, lo restituisci da onCreateDialog e Android fa la sua magia. Se provi a ottenere il proprietario dal costruttore, Android non l'ha ancora collegato, quindi non hai ancora un proprietario.

Così si può fare uno di questi:

public class DemoDialog extends Dialog { 
    public DemoDialog(Context context) { 
     super(context); 

     // chances of context not being an activity is very low, but better to check. 
     Activity owner = (context instanceof Activity) ? (Activity)context : null; 
     if (owner != null) { 
      // owner activity is defined here 
     } 
    } 

    public void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     // getOwnerActivity() should be defined here if called via showDialog(), so do the related init here 
     Activity owner = getOwnerActivity(); 
     if (owner != null) { 
      // owner activity defined here 
     } 
    } 
} 

Nota che il secondo metodo è preferito perché

+0

Nota: voglio dire la chiamata onCreate() della finestra di dialogo. Tuttavia, potrebbe essere necessario inserirlo in AttachedToWindow() se ciò non riesce, perché Android potrebbe in effetti differire la sua magia arbitrariamente. Detto questo, se hai bisogno di accedere al proprietario dal costruttore, il proprietario è "contesto", quindi usa "contesto" :) – Sajid

+0

Grazie per la tua risposta, Sajid. Ho provato a seguire il tuo suggerimento ma il sitll è diventato nullo, potresti condividere il tuo codice? – eric2323223

+0

Aggiunto come una modifica sopra. Dopotutto devi effettuare il check-in su AttackToWindow(). – Sajid

16

Ho cercato di usare getOwnerActivity() metodo in tutti i possibili metodi di mia custom Dialog. Restituisce sempre null (Android 2.3). Poi ho controllato il suo codice sorgente e l'attività che restituisce è impostata solo su setOwnerActivity(Activity activity) che non viene chiamato da nessuna parte. Quindi, se volete getOwnerActivity() di valore diverso da zero tornare, devi fare questo:

public MyCustomDialog(Context context) { 
    super(context); 
    if (context instanceof Activity) { 
     setOwnerActivity((Activity) context); 
    } 
} 
+0

vero !!!!!!!!!!! –

0

Questo, di seguito, ha lavorato per me.

private Activity activity; 

public MyCustomDialog(Activity activity) { 
    super(activity); 
    this.activity = activity; 
} 

Quindi utilizzo attività invece di getOwnerActivity().

1

Puoi estende la finestra di dialogo personalizzato da AppCompatDialog e l'accesso all'attività da questo codice:

public static Activity scanForActivity(Context context) { 
    if (context == null) 
     return null; 
    else if (context instanceof Activity) 
     return (Activity) context; 
    else if (context instanceof ContextWrapper) 
     return scanForActivity(((ContextWrapper) context).getBaseContext()); 
    return null; 
} 
Problemi correlati