我在创建对话框时有时会报告此错误,我自己没有遇到错误,并且似乎每个用户都没有这样做,因为我正在通过对话框发送数据。我测试了android 2.2。这是代码。
private static final int DIALOG_CONTEST_ENTRY = 939321;
showDialog(DIALOG_CONTEST_ENTRY);
protected Dialog onCreateDialog(int id) {
switch (id) {
case DIALOG_CONTEST_ENTRY:
final Dialog dialog = new Dialog(this);
dialog.setContentView(R.layout.contest_entry_dialog);
dialog.setTitle(getString(R.string.ContestEntryDialogTitle));
dialog.setCanceledOnTouchOutside(true);
TextView text = (TextView) dialog.findViewById(R.id.contest_text);
text.setText(getString(R.string.ContestEntryDialogText));
Button sendButton = (Button) dialog.findViewById(R.id.ButtonSend);
Button cancelButton = (Button) dialog.findViewById(R.id.ButtonCancel);
final EditText name = (EditText) dialog.findViewById(R.id.editName);
final EditText email = (EditText) dialog.findViewById(R.id.editEmail);
final TextView score = (TextView) dialog.findViewById(R.id.textScore);
final Prefs prefs = new Prefs(xxxActivity.this);
name.setText(prefs.ReadString("Name"));
email.setText(prefs.ReadString("Email"));
score.setText("Score: " + scoreCurrent);
sendButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//Send form
dialog.dismiss();
}
}
});
cancelButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialog.dismiss();
}
});
dialog.show();
return dialog;
default:
break;
}
return super.onCreateDialog(id);
}
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp" android:background="#FFF">
<TextView
android:id="@+id/contest_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/ContestEntryDialogText"
android:textColor="#000" />
<EditText
android:id="@+id/editName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textPersonName" android:hint="Enter Name"/>
<EditText
android:id="@+id/editEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textEmailAddress" android:hint="Enter Email">
<requestFocus />
</EditText>
<TextView
android:id="@+id/textScore"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Score: " android:textSize="20dp"/>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<Button
android:id="@+id/ButtonSend"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send" />
<Button
android:id="@+id/ButtonCancel"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Cancel" />
</LinearLayout>
答案 0 :(得分:1)
在遇到同样的问题(并发现从onPause中调用removeDialog无法可靠地工作)之后,我开发了一种似乎起作用的解决方法(尽管它确实是一种黑客行为)。
如grepcode link posted by antslava所示,在方法performRestoreInstanceState中,onRestoreInstanceState在restoreManagedDialogs之前调用,并传递给Bundle savedInstanceState的同一个实例。
final void performRestoreInstanceState(Bundle savedInstanceState) {
onRestoreInstanceState(savedInstanceState);
restoreManagedDialogs(savedInstanceState);
}
因此,有机会修改从onRestoreInstanceState方法传递给restoreManagedDialogs的Bundle savedInstanceState。
为了防止恢复任何和所有托管对话框,可以通过以下方式实现onRestoreInstanceState:
// This same variable is defined as private in the Activity class. I need
// access to it, so I redefine it here.
private static final String SAVED_DIALOGS_TAG = "android:savedDialogs";
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
if (null != b) {
savedInstanceState.remove(SAVED_DIALOGS_TAG);
}
}
这会导致密钥“android:savedDialogs”引用的Bundle从Bundle savedInstanceState中删除,这会导致对restoreManagedDialogs的调用在发现无法找到此密钥时立即返回:
private void restoreManagedDialogs(Bundle savedInstanceState) {
final Bundle b = savedInstanceState.getBundle(SAVED_DIALOGS_TAG);
if (b == null) {
return;
}
...
}
这将导致在恢复活动时不调用onCreateDialog,有效地“隐藏”任何对话框,从而防止必须从onCreateDialog返回null的情况发生。
这不是“一刀切”的解决方案,但考虑到我的要求,似乎符合要求。通过查看grepcode中几个平台版本(1.6,2.1,2.2,2.2.2和4.0.3)的代码,看来这个解决方案应该在这些现有实现的情况下保持一致。