Есть ли разница между Dialog.getContext () и Activity, которая сделала диалог? - PullRequest
1 голос
/ 17 октября 2011

Наше приложение использует вложенные диалоги, и мы успешно создали один диалог поверх другого, построив его из метода getContext() первого диалога. Итак:

Активность:

//...
Dialog1 dialog = new Dialog1(this);
dialog.show();
//...

Dialog1:

//...
Dialog1(Context context) {
    super(context);
    //etc.
}

public void onSomeCondition() {
    Dialog2 dialog2 = new Dialog2(getContext());
    dialog2.show();
    //etc.
}

Однако есть обстоятельство, когда мы хотим запустить Dialog2 непосредственно из Activity, когда Dialog1 все еще виден. Итак, мы поместили этот метод в Activity:

public void onSomeOtherCondition() {
    Dialog2 dialog = new Dialog2(this); //crunch
    dialog.show();
    //etc.
}

Менеджеру окон это совсем не нравится. Так что же, getContext() на самом деле НЕ точно совпадает с ContextWrapper -несс в Деятельности? Если именно так, как этот вторичный контекст отличается от первичного, и если (например) вы передали обратно getContext() из диалога в вызывающую активность, это создаст тот же риск утечки, что и удержание ссылки на контекст в другом месте, может делать?

Если это не контекст, в чем причина проблемы?

Ответы [ 2 ]

1 голос
/ 17 октября 2011

Я подозреваю, что проблема с запуском Диалога 2 из Деятельности 1, когда Диалог 1 видим, потому что Диалог 1 (не Мероприятие 1) находится на вершине стека активности. Я ни в коем случае не эксперт, но я подозреваю, что только Активность в верхней части стека Активностей может запускать новые Активности.

1 голос
/ 17 октября 2011

Я не совсем уверен, отличаются ли контексты (может показаться, что они есть), но я подозреваю, что проблема в том, что вы не закрываете Dialog1 перед тем, как пытаться запустить Dialog2 из своей активности.WindowManager, вероятно, рассержен, потому что вы пытаетесь запустить диалоговое окно поверх вашей Активности, но Dialog1 уже там.

Короче говоря, я думаю, вам нужно:

    public void onSomeOtherCondition() {
         this.dismiss();
         mActivity.onSomeOtherCondition(); //we have a reference to the activity
    }

РЕДАКТИРОВАТЬ

Решение, которое я предложил в комментариях, состоит в том, чтобы передать контекст Dialog1 вmActivity.onSomeOtherCondition, чтобы вы могли создать Dialog2 с контекстом, который находится на вершине стека.

...