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)实现。