我已经看到了在应用程序中实例化一个新Fragment的两个通用实践:

Fragment newFragment = new MyFragment();

and

Fragment newFragment = MyFragment.newInstance();

第二个选项使用静态方法newInstance(),通常包含以下方法。

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

起初,我认为主要的好处是,我可以重载newInstance()方法,以便在创建新的Fragment实例时提供灵活性——但我也可以通过为Fragment创建重载构造函数来实现这一点。

我错过什么了吗?

一种方法相对于另一种方法有什么好处?还是说这只是一个很好的练习?


当前回答

理想情况下,我们不应该在片段构造函数中传递任何东西,片段构造函数应该是空的或默认的。 现在第二个问题是,如果我们想传递接口变量或参数 我们应该使用Bundle来传递数据。 对于Interface,我们可以在bundle中putParceble,并使该接口实现parceble 如果可能的话,我们可以在活动和片段中实现该接口,我们可以在OnAttach中初始化监听器,在那里我们有上下文[(上下文)监听器]。

因此,在配置更改期间(例如字体更改),Activity重新创建侦听器不会去非初始化,我们可以避免空指针异常。

其他回答

你可以这样使用smth:

val fragment = supportFragmentManager.fragmentFactory.instantiate(classLoader, YourFragment::class.java.name)

因为这个答案现在已经被弃用了

我不同意yydi的回答:

如果Android决定稍后重新创建Fragment,它会调用 片段的无参数构造函数。重载 构造函数不是解决方案。

我认为这是一个很好的解决方案,这正是它被Java核心语言开发的原因。

确实,Android系统可以破坏和重建你的碎片。所以你可以这样做:

public MyFragment() {
//  An empty constructor for Android System to use, otherwise exception may occur.
}

public MyFragment(int someInt) {
    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    setArguments(args);
}

它将允许您稍后从getArguments()中提取someInt,即使该Fragment已被系统重新创建。这是比静态构造函数更优雅的解决方案。

在我看来,静态构造函数是无用的,不应该使用。此外,如果将来你想扩展这个Fragment并向构造函数添加更多功能,它们也会限制你。使用静态构造函数你不能这样做。

更新:

Android增加了标记所有非默认构造函数错误的检查。 由于上面提到的原因,我建议禁用它。

使用此代码100%修复您的问题

在firstFragment中输入这个代码

public static yourNameParentFragment newInstance() {

    Bundle args = new Bundle();
    args.putBoolean("yourKey",yourValue);
    YourFragment fragment = new YourFragment();
    fragment.setArguments(args);
    return fragment;
}

这个示例发送布尔数据

和在SecendFragment

yourNameParentFragment name =yourNameParentFragment.newInstance();
   Bundle bundle;
   bundle=sellDiamondFragments2.getArguments();
  boolean a= bundle.getBoolean("yourKey");

必须值在第一个片段是静态的

快乐的代码

setArguments()没有用。这只会带来混乱。

public class MyFragment extends Fragment {

    public String mTitle;
    public String mInitialTitle;

    public static MyFragment newInstance(String param1) {
        MyFragment f = new MyFragment();
        f.mInitialTitle = param1;
        f.mTitle = param1;
        return f;
    }

    @Override
    public void onSaveInstanceState(Bundle state) {
        state.putString("mInitialTitle", mInitialTitle);
        state.putString("mTitle", mTitle);
        super.onSaveInstanceState(state);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
        if (state != null) {
            mInitialTitle = state.getString("mInitialTitle");
            mTitle = state.getString("mTitle");
        } 
        ...
    }
}

实例化片段的最好方法是使用默认的片段。实例化方法或创建工厂方法来实例化片段 注意:总是在片段中创建一个空构造函数,而在恢复片段内存时会抛出运行时异常。