android - 显示带适配器的 AlertDialog 的 DialogFragment 无法在方向更改后存活

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

我在这个问题上碰壁了。我的 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/

相关文章:

android - IllegalStateException:应用程序的 PagerAdapter 在没有调用 PagerAdapter#notifyDataSetChanged 的​​情况下更改了适配器的内容

java.lang.IllegalStateException : Default FirebaseApp is not initialized in this process

android - FFMPEG 安卓库

android - Horizo​​ntal RecyclerView 项目居中

java - 在 Android 警报对话框中使用 HTML

android - java.lang.IllegalStateException : View with id -1 错误

android - 是否可以在android的新导航组件中发送字符串或整数以外的参数

Android Action Bar 选项卡,一起设置图标和文本的样式

android - 如何在用户长按列表项时弹出对话框确认删除?

android - 从对话框更新 Activity 的 ListView