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

标签 android dialog setcontentview

我有一个对话框,里面有一些 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/

相关文章:

java - ListView列表-引用变量还是对象?

android - 在内部和外部 SdCard 上存储文件

android - 隐藏的 backstack fragment 在配置更改时重新显示

java - 如何获取从蓝牙传入消息返回的字节数组值并在将其显示在其他设备上之前对其进行编辑?

jquery - 当编辑器失去焦点时,jQuery 对话框中的 TinyMCE 编辑器会自动滚动到顶部

python - Tkinter 对话框 showinfo 循环错误

java - 自定义 ListView 上的 picasso

Javascript将单选按钮添加到DOM中的对话框

android - 使用微调器、 Activity 结构切换 fragment

Android资源未找到异常oncreate