我有一个对话框,里面有一些 UI 元素。此对话框稍后通过 show()
创建并显示。我可以使用默认构造函数 Dialog(Context)
创建对话框。但我的内容 View 仅在 onCreate
上设置,它在 show()
函数之后调用。当我尝试像这样修改 UI 元素时,这会导致 NPE:
public void showNumber(String number)
{
labelNumber.setText(number);
show();
}
但是如果像下面这样调用上面的函数,它大部分时间都可以工作。 (有时如果手机变慢,它会失败,因为 setContentView
在执行 setText
时不会被调用)
public void showNumber(String number)
{
show();
labelNumber.setText(number);
}
如何创建对话框并设置内容 View 而不显示它。如果我手动调用 setContentView()
,它会在我第一次调用 show()
时被重新调用。
最佳答案
您需要做的就是在构建对话框时调用 create();
。
当您调用 show 时,只有当 create();
没有被调用时,它才会创建对话框,然后在对话框上调用 onStart();
。最后,它将对话框附加到窗口。
类似于:
Dialog myDialog = new Dialog(context) {
protected void onCreate() {
super.onCreate();
doYourThing
}
};
myDialog.create();
我假设您在 onCreate 中执行逻辑,因为在 Dialog 中它只是一个供子类覆盖的空方法。
创建时: 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
关于Android 创建和初始化窗口而不显示它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32164623/