Android newInstance()模式

示例

尽管可以使用参数创建片段构造函数,但Android在重新创建片段时会内部调用零参数构造函数(例如,如果由于Android自身原因而杀死它们后将其还原)。因此,建议不要依赖具有参数的构造函数。

为了确保始终存在期望的片段参数,您可以使用静态newInstance()方法创建片段,并将所需的任何参数放入创建新实例时可用的包中。

import android.os.Bundle;
import android.support.v4.app.Fragment;

public class MyFragment extends Fragment
{
  // 我们从参数获取名称的标识符
  private static final String NAME_ARG = "name";

  private String mName;

  // 需要
  public MyFragment(){}

  //静态构造函数。这是实例化的唯一方法
  // 片段自己
  public static MyFragment newInstance(final String name) {
    final MyFragment myFragment = new MyFragment();
    // 下面的1是一种优化,它是将
    //被添加到该捆绑包中。如果您知道参数数量,则将添加
    //到捆绑销售商品时,它将停止对备用映射的其他分配。如果
    // 不确定,您可以构建不带任何参数的Bundle
    final Bundle args = new Bundle(1);

    //这会将参数存储为捆绑软件中的参数。请注意,即使
    // 'name'参数为NULL则可以使用,因此您应该考虑
    // 在这一点上,如果参数是强制性的,则检查NULL和
    // 如果是,则抛出适当的错误
    args.putString(NAME_ARG, name);

    myFragment.setArguments(args);
    return myFragment;
  }

  @Override
  public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final Bundle arguments = getArguments();
    if (arguments == null || !arguments.containsKey(NAME_ARG)) {
      // 根据需要设置默认值或错误
    } else {
      mName = arguments.getString(NAME_ARG);
    }
  }
}

现在,在活动中:

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
MyFragment mFragment = MyFragment.newInstance("my name");
ft.replace(R.id.placeholder, mFragment);
//R.id.placeholder是我们要加载片段的位置
ft.commit();

这种模式是确保在创建时将所有需要的参数传递给片段的最佳实践。请注意,当系统销毁片段并在以后重新创建它时,它将自动恢复其状态-但您必须为其提供onSaveInstanceState(Bundle)实现。