1

我有一个对话框,里面有一些 UI 元素。该对话框是稍后通过创建和显示的show()。我可以使用默认构造函数创建对话框Dialog(Context)。但是我的内容视图仅设置在函数onCreate后调用的对象上show()。当我尝试像这样修改 UI 元素时,这会导致 NPE:

public void showNumber(String number)
{
    labelNumber.setText(number);
    show();
}

但是如果调用改变上面的函数如下,它大部分时间都可以工作。(有时如果手机变慢,它会失败,因为setContentView它在执行时不会被调用setText

public void showNumber(String number)
{
    show();
    labelNumber.setText(number);
}

您如何创建对话框并设置内容视图而不显示它。如果我手动调用,当我第一次setContentView()调用时它会被重新调用。show()

4

1 回答 1

3

您需要做的就是create();在构建对话框时调用它。

当你调用 show 时,它只会在create();没有被调用时创建对话框,然后onStart();在对话框上调用。最后,它将对话框附加到窗口。

就像是:

Dialog myDialog = new Dialog(context) {
    protected void onCreate() {
         super.onCreate();
         doYourThing
    }
};
myDialog.create();

我假设您在 onCreate 中执行逻辑,因为在 Dialog 中,它只是子类要覆盖的空方法。

onCreate: http ://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/app/Dialog.java#37

显示: http ://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/app/Dialog.java#254

Pre API level 21(如果你不能使用 AlertDialog.Builder)你应该可以onRestoreInstanceState用来做你想做的事情,就像这样(这是一个 hack):

Bundle myBundle = new Bundle();
myBundle.putBoolean("android:dialogShowing", false);
myBundle.putBundle("android:dialogHierarchy", new Bundle());
myDialog.onRestoreInstanceState(myBundle);

信息:

http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/app/Dialog.java#411

于 2015-08-23T09:00:38.680 回答