我编写了一个自定义对话框并试图从其父活动中获取一些数据,但是当我调用getOwnerActivity时我总是得到null,有人能告诉我为什么会这样吗?为什么我无法在显示来自TestDialogActivity的数据时显示DemoDialog中的数据?
提前谢谢了.
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);
}
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*lev 24
我尝试getOwnerActivity()在我的所有可能的方法中使用方法custom Dialog.它总是返回null(Android 2.3).然后我检查了它的源代码,它返回的活动只设置在setOwnerActivity(Activity activity)任何地方都没有调用.因此,如果要getOwnerActivity()返回不同于null的值,则必须执行以下操作:
public MyCustomDialog(Context context) {
super(context);
if (context instanceof Activity) {
setOwnerActivity((Activity) context);
}
}
Run Code Online (Sandbox Code Playgroud)
如果你考虑一下情况,你就会明白为什么.调用时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
}
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,第二种方法是首选方法,因为