我有一个看起来像这样的片段类:
public class MessageFragment extends Fragment {
Context ctx;
Button compose;
public MessageFragment(Context ctx){
this.ctx = ctx;
}
...}
构造函数它给出了一个错误
此片段应提供默认构造函数
与此同时,我有4个其他片段类,这些格式以这种方式格式化,但它们不会出现此错误。我该如何解决这个问题?
答案 0 :(得分:2)
当您因配置更改(例如方向更改)重新创建Activity
时,系统将通过创建Fragment
的新实例来管理重新创建片段的状态,然后使用setArguments(Bundle args)
传递参数。它使用默认构造函数来重新创建片段,这就是它所需的原因。您应该从不依赖于片段的非默认构造函数中发生的逻辑,因为您将立即打破配置更改。
此外,将Context
传递给您的Fragment
似乎等待发生内存泄漏。它可能没有,但这不是好的做法。等到Fragment
生命周期事件之一,例如onCreate()
或onAttach()
,并将对getActivity()
的引用存储为Context
。然后,您可以在onDetach()
。
编辑:基本上,您需要传递的Fragment
正常运行的任何内容都应存储在其Bundle
参数中,或保存在onSaveInstanceState(Bundle outState)
事件中并在onCreate(Bundle state)
中恢复{1}},否则你会在配置更改时丢失它。
这就是为什么有一种用于创建片段的静态工厂方法的常见模式。例如:
public static Fragment newInstance(String arg1, int arg2) {
Fragment result = new MyFragment();
Bundle args = new Bundle();
args.putString("arg1_key", arg1);
args.putInt("arg2_key", arg2);
result.setArguments(args);
return result;
}
然后使用它而不是非默认构造函数。在Fragment
内,您可以使用以下方式检索数据:
Bundle args = getArguments();
String arg1 = args.getString("arg1_key");
int arg2 = args.getInt("arg2_key");
答案 1 :(得分:0)
只需添加一个像这样的默认构造函数
public MessageFragment(){}
你应该做得好。