【问题标题】:Fragment null must be a public static class to be properly recreated from instance state片段 null 必须是公共静态类才能从实例状态正确重新创建
【发布时间】:2017-02-20 02:15:20
【问题描述】:

我无法弄清楚为什么我的应用程序在调用 getSupportFragmentManager() 时崩溃。我在其他应用程序中使用了类似的代码来创建警报对话框,没有任何问题。请帮助!

DialogFragment df = new DialogFragment(){

        @NonNull
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            View view = getActivity().getLayoutInflater().inflate(R.layout.addincome,null);
            builder.setView(view);
            //capture
            final EditText amountEditText=(EditText)view.findViewById(R.id.edit_amount);
            final EditText descriptionEditText=(EditText)view.findViewById(R.id.edit_description);
            builder.setNegativeButton(android.R.string.cancel,null);
            builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    newIncome.setAmount(Double.parseDouble(amountEditText.getText().toString()));
                    newIncome.setDescription(descriptionEditText.getText().toString());
                    user.incomes.add(newIncome);
                    HashMap<String,User> modified = new HashMap<>();
                    modified.put(uid,user);
                    rootref.setValue(modified);
                }
            });
            return builder.create();
        }
    };
    df.show(getSupportFragmentManager(),"addIncome");

【问题讨论】:

    标签: java android android-studio android-fragments android-alertdialog


    【解决方案1】:

    您的DialogFragment 是一个匿名类,在Java 中匿名类只能由父类实例化:new DialogFragment() 实际上是this.new DialogFragment()。显然,当FragmentManager 尝试在配置更改时重新创建您的DialogFragment 时,它不能,因为它无权访问父类的实例。解决方案是声明DialogFragmentstatic 子类,或声明DialogFragment 的顶级子类,并使用它代替匿名类。

    【讨论】:

    • 而且它还必须有一个默认(无参数)构造函数
    • 我是否可以创建一个包含此内容的上下文并使用 context.new DialogFragment() ??
    • 很抱歉无法为您的答案投票,我的声誉太低了....谢谢
    【解决方案2】:

    无论您使用的是 android.support.v4.app.Fragment 还是 android.os.Fragment,请检查您在导入时使用的 Fragment 类型。

    【讨论】:

    • 导入android.support.v4.app.DialogFragment;
    【解决方案3】:

    我知道您已经完成了这一步,但只是询问您是否尝试重建 APK?因为如果此代码在其他应用程序中有效,那么它们一定是一些 .classes 问题。

    【讨论】:

    • 我尝试过...仍然没有工作...我认为其他应用程序有@suppresslint 选项,但我是初学者,不知道如何添加或检查这个选项
    • 您可以通过在 build.gradle lintOptions { abortOnError false } 中编写以下内容来禁用 android studio 中的 lint
    猜你喜欢
    • 2017-01-10
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多