getOwnerActivity在自定义对话框中返回null

时间:2011-09-25 01:59:06

标签: android dialog

我编写了一个自定义对话框并试图从其父活动中获取一些数据,但是当我调用 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);
    }
}

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

4 个答案:

答案 0 :(得分:22)

我尝试在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);
    }
} 

答案 1 :(得分:7)

如果你考虑一下情况,你就会明白为什么。当您调用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
        }
    }
}

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

答案 2 :(得分: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;
}

答案 3 :(得分:0)

下面这个对我有用。

private Activity activity;

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

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