Android创建并初始化窗口而不显示它

Android创建并初始化窗口而不显示它,android,dialog,setcontentview,Android,Dialog,Setcontentview,我有一个对话框,里面有一些UI元素。此对话框稍后将通过show()创建并显示。我可以使用默认构造函数创建对话框dialog(Context)。但是我的内容视图只设置在onCreate上,它是在show()函数之后调用的。当我尝试这样修改UI元素时,这会导致NPE: public void showNumber(String number) { labelNumber.setText(number); show(); } 但是,如果调用按以下方式更改上述函数,则它在大多数情况下都

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

public void showNumber(String number)
{
    labelNumber.setText(number);
    show();
}
但是,如果调用按以下方式更改上述函数,则它在大多数情况下都有效。(有时,如果手机速度变慢,它会失败,因为执行时不会调用
setContentView


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

您需要做的就是调用
create()

当您调用show时,它将仅在
create()时创建对话框尚未调用,然后调用
onStart()。最后,它会将对话框附加到窗口

比如:

Dialog myDialog = new Dialog(context) {
    protected void onCreate() {
         super.onCreate();
         doYourThing
    }
};
myDialog.create();
我假设您在onCreate中执行逻辑,因为在对话框中,它只是一个空方法,子类可以重写

一旦创建:

展示:

API级别21之前的版本(如果您不能使用AlertDialog.Builder),您应该能够使用
onRestoreInstanceState
来完成您想做的事情,就像这样(这是一种黑客行为):

信息:


在变量中存储
number
,包装
show()
新处理程序()中。在
onCreate
@SaschaKolberg中发布
调用并将'labelNumber'设置为
number
。我将数字存储在变量中,并重写onStart()以设置在onCreate()之后调用的文本,直到找到正确的方法来创建它。create()是我一直在寻找的,但它需要API级别21,我无法使用它。另一种方法是在对话框上调用onRestoreInstanceState,我将向您展示代码。
Dialog myDialog = new Dialog(context) {
    protected void onCreate() {
         super.onCreate();
         doYourThing
    }
};
myDialog.create();
Bundle myBundle = new Bundle();
myBundle.putBoolean("android:dialogShowing", false);
myBundle.putBundle("android:dialogHierarchy", new Bundle());
myDialog.onRestoreInstanceState(myBundle);