2011-09-25 294 views
8

我写一个自定义对话框,并试图从其父活动的一些数据,但我总是得到当我打电话getOwnerActivity,谁能告诉我,为什么出现这种情况?为什么我可以在DemoDialog中显示数据而无法显示来自TestDialogActivity的数据?getOwnerActivity返回null定制对话框

非常感谢提前。

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

回答

5

如果您想了解情况,你就会明白为什么。当您拨打new DemoDialog(this)时,您将执行构造函数中的所有代码。之后,你从onCreateDialog返回它,Android发挥它的魔力。如果您尝试从构造函数中获取所有者,Android尚未将其挂钩,因此您还没有所有者。

所以,你可以做以下任一:

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

注意,第二个方法是首选,因为

+0

注:我指的是对话的OnCreate()调用。但是,如果失败,您可能需要将它放在onAttachedToWindow()中,因为Android实际上可能会随意推迟其魔术。也就是说,如果您需要从构造函数访问所有者,则所有者为“context”,因此只需使用“context”:) – Sajid

+0

感谢您的回复,Sajid。我试图按照你的建议,但sitll得到空,你能分享你的代码吗? – eric2323223

+0

作为上面的编辑添加。毕竟,你必须检查onAttachToWindow()。 – Sajid

16

我试图用getOwnerActivity()方法在我custom Dialog的所有可能的方法。它总是返回null(Android 2.3)。然后我检查了它的源代码,并且它返回的活动只在setOwnerActivity(Activity activity)中设置,而不是在任何地方调用。所以,如果你想getOwnerActivity()返回比空不同的值,你必须这样做:

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

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

0

此,下面,为我工作。

private Activity activity; 

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

然后我使用activity而不是getOwnerActivity()。

1

你可以通过这个代码扩展从AppCompatDialog您的自定义对话框,并访问活动:

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