Android中Fragment的默认构造函数

时间:2014-01-10 00:20:01

标签: android android-fragments

我有一个看起来像这样的片段类:

public class MessageFragment extends Fragment {
    Context ctx;
    Button compose;

    public MessageFragment(Context ctx){
        this.ctx = ctx;
    }
...}

构造函数它给出了一个错误

  

此片段应提供默认构造函数

与此同时,我有4个其他片段类,这些格式以这种方式格式化,但它们不会出现此错误。我该如何解决这个问题?

2 个答案:

答案 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(){}

你应该做得好。