我在这个问题上碰壁了。我的 DialogFragment 与我拥有的所有其他对话框配合良好,但使用客户适配器的对话框除外。第二次更改方向时,我得到一个 java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity
This is using the API 4+ Support package.
它不会在第一次方向更改时发生,它总是在第二次发生,这意味着它按以下顺序发生,对话框显示:
- 肖像 -> 风景 -> 肖像 -> java.lang.IllegalStateException
- 风景 -> 肖像 -> 风景 -> java.lang.IllegalStateException
这是对话框:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
final DialogItem[] items = {
new DialogItem(getString(R.string.test1), R.drawable.test1),
new DialogItem(getString(R.string.test2), R.drawable.test2),
};
ListAdapter adapter = new ArrayAdapter<DialogItem>(getActivity(),
android.R.layout.select_dialog_item,
android.R.id.text1,
items){
public View getView(int position, View convertView, ViewGroup parent) {
View v = super.getView(position, convertView, parent);
TextView tv = (TextView)v.findViewById(android.R.id.text1);
tv.setCompoundDrawablesWithIntrinsicBounds(items[position].icon, 0, 0, 0);
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
tv.setCompoundDrawablePadding(dp10);
return v;
}
};
return new AlertDialog.Builder(getActivity())
.setTitle(R.string.title)
.setIcon(R.drawable.icon)
.setAdapter(adapter, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) {
if (item == 0)
doThis();
else
doThat();
}
}).create();
}
这是一个 DialogItem:
class DialogItem {
public final String text;
public final int icon;
public DialogItem(String text, Integer icon) {
this.text = text;
this.icon = icon;
}
@Override
public String toString() {
return text;
}
}
我知道包含适配器是一个问题,因为如果我从 AlertDialog.Builder
中删除 .setAdapter()
调用,那么问题就会消失。
同样奇怪的是,我的 ICS 设备没有问题。这只发生在我测试的 Gingerbread 设备上。非常感谢任何帮助!
谢谢!
马特。
最佳答案
问题解决了。从 Activity 而不是 DialogFragment 调用 getResources() 资源是必要的更改。
之前:
int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);
之后:
int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f);
关于android - 显示带适配器的 AlertDialog 的 DialogFragment 无法在方向更改后存活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9390938/