片段 null 必须是公共静态类才能从实例状态正确重新创建

Posted

技术标签:

【中文标题】片段 null 必须是公共静态类才能从实例状态正确重新创建【英文标题】:Fragment null must be a public static class to be properly recreated from instance state 【发布时间】: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");

【问题讨论】:

【参考方案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

以上是关于片段 null 必须是公共静态类才能从实例状态正确重新创建的主要内容,如果未能解决你的问题,请参考以下文章

在android studio中升级repo v9后,片段必须是公共静态类崩溃错误

为啥 C# 公共静态变量不需要实例化?

php单例模式的实例

从单独的类文件访问公共静态类的状态

课程作业02

静态变量和实例变量的区别?