片段 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
时,它不能,因为它无权访问父类的实例。解决方案是声明DialogFragment
的static
子类,或声明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 必须是公共静态类才能从实例状态正确重新创建的主要内容,如果未能解决你的问题,请参考以下文章