示例
尽管可以使用参数创建片段构造函数,但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)实现。