2011-09-25 11 views
8

escribo un diálogo personalizado y tratar de obtener algunos datos de su actividad principal, pero siempre me sale nula cuando llamo getOwnerActivity, podría alguien decirme por qué sucede esto? ¿Por qué puedo mostrar los datos en DemoDialog mientras no puedo mostrar los datos de TestDialogActivity?getOwnerActivity devuelve un valor nulo en el cuadro de diálogo personalizado

Muchas gracias de antemano.

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; 
    } 
} 

Respuesta

5

Si se piensa en la situación, se entiende por qué. Cuando llamas al new DemoDialog(this), ejecutas todo el código en el constructor. Después de eso, lo devuelve desde onCreateDialog y Android hace su magia. Si intentas obtener el propietario del constructor, Android aún no lo ha conectado, por lo que todavía no tienes dueño.

Por lo que puede hacer cualquiera de estas:

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 
     } 
    } 
} 

Tenga en cuenta que es preferible el segundo método porque

+0

Nota: me refiero a la llamada onCreate() del cuadro de diálogo. Sin embargo, es posible que deba colocarlo en AttachedToWindow() si eso falla, porque Android de hecho puede diferir su magia arbitrariamente. Dicho eso, si necesita acceder al propietario desde el constructor, el propietario es "context", así que simplemente use "context" :) – Sajid

+0

Gracias por su respuesta, Sajid. Traté de seguir tu sugerencia pero sentll nulo, ¿podrías compartir tu código? – eric2323223

+0

Agregado como una edición anterior. Después de todo, debe registrarse en AttchToWindow(). – Sajid

16

He intentado utilizar getOwnerActivity() método en todos los métodos posibles de mi custom Dialog. Siempre devuelve nulo (Android 2.3). Luego revisé su código fuente y la actividad que devuelve se establece solo en setOwnerActivity(Activity activity) que no se llama en ningún lado. Así que si quieres volver a getOwnerActivity() valor diferente de cero, lo que tiene que hacer esto:

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

true !!!!!!!!!!! –

0

Esto, a continuación, trabajó para mí.

private Activity activity; 

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

Luego uso la actividad en lugar de getOwnerActivity().

1

Puede extiende su diálogo personalizado de AppCompatDialog y el acceso a la actividad por este código:

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; 
} 
Cuestiones relacionadas