显示带适配器的AlertDialog的DialogFragment无法在方向更改后继续存在

时间:2012-02-22 07:49:17

标签: android android-alertdialog illegalstateexception android-orientation android-dialogfragment

我在这个上撞墙了。我的DialogFragment适用于我使用的所有其他对话框,除了使用客户适配器的对话框。第二次更改方向时,我得到java.lang.IllegalStateException: Fragment NewAlertDialog{447bc528} not attached to Activity这是使用API​​ 4+支持包。

在第一个方向更改时不会发生,它总是发生在第二个方向上,这意味着它按顺序发生,对话框显示:

  • 肖像 - >风景 - >肖像 - > 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;
    }
}

我知道包含适配器是一个问题,因为如果我从.setAdapter()删除了AlertDialog.Builder来电,则问题就会消失。

奇怪的是我的ICS设备上没有问题。这只发生在我测试的Gingerbread设备上。非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:2)

问题解决了。从Activity调用getResources()资源而不是DialogFragment是必要的更改。

在:

int dp10 = (int) (10 * getResources().getDisplayMetrics().density + 0.5f);

后:

int dp10 = (int) (10 * getActivity().getResources().getDisplayMetrics().density + 0.5f);