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

时间:2015-08-23 08:18:57

标签: android dialog setcontentview

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

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

但是如果呼叫改变上面的功能如下,它大部分时间都有效。 (如果手机变慢,有时会失败,因为setContentView在执行时setText不会被调用{/ 1}}

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

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

1 个答案:

答案 0 :(得分:1)

您需要做的就是在构建对话框时调用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等级21(如果你不能使用AlertDialog.Builder)你应该可以使用onRestoreInstanceState来做你想做的事情,比如这个(这是一个黑客):< / p>

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