Fragment中的getActivity()为null的问题
向Fragment传递参数
1. 向Fragment传递参数第一步在AFragment中
java 代码:AFragment.class
public class AFragment extends Fragment {
private TextView mTvTitle;
/**
* 调用这个方法,可以的到一个已经传好参数的fragment
* @param title
* @return
*/
public static AFragment newInstance(String title){
AFragment fragment=new AFragment();
Bundle bundle=new Bundle();
bundle.putString("title",title);
fragment.setArguments(bundle);
//即使fragment重构,也会通过反射的机制,把重新实例化的fragment设上参数title
return fragment;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//相当于activity的onCreate里的setcontentView,给它一个布局文件返回一个视图文件
View view=inflater.inflate(R.layout.fragment_a,container,false);
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
//当View创建完成后,这里有一个回调方法
super.onViewCreated(view, savedInstanceState);
mTvTitle=(TextView)view.findViewById(R.id.tv_title);
if(getArguments()!=null){
//获取参数
mTvTitle.setText(getArguments().getString("title"));
}
}
@Override
public void onAttach(@NonNull Context context) {
//当Fragment与Activity发生关联时调用
super.onAttach(context);
}
@Override
public void onDetach() {
//与onAttach相对应,当Fragment与Activity关联被取消时调用
//当调用这个方法后,会出现getactivity()为空
super.onDetach();
}
@Override
public void onDestroy() {
super.onDestroy();
//取消异步
}
}
关键代码1
1. 设一个静态的构造方法 AFragment newInstance(String title),返回一个已经传好参数的fragment
2. 通过Bundle传参数
3. 调用setArguments()
public static AFragment newInstance(String title){
AFragment fragment=new AFragment();
Bundle bundle=new Bundle();
bundle.putString("title",title);
fragment.setArguments(bundle);
//即使fragment重构,也会通过反射的机制,把重新实例化的fragment设上参数title
return fragment;
}
关键代码 2
1. 在id为tv_title的textview控件中获取参数,即等会会在这个控件里显示传入的字符串title
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
//当View创建完成后,这里有一个回调方法
super.onViewCreated(view, savedInstanceState);
mTvTitle=(TextView)view.findViewById(R.id.tv_title);
if(getArguments()!=null){
//获取参数
mTvTitle.setText(getArguments().getString("title"));
}
}
java 代码:ContainerActivity.class
public class ContainerActivity extends AppCompatActivity {
private AFragment aFragment;
private BFragment bFragment;
private Button btn_change;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_container);
btn_change = (Button) findViewById(R.id.btn_change);
btn_change.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(bFragment == null){
bFragment=new BFragment();
}
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,bFragment).commitAllowingStateLoss();
}
});
//R.id.fl_container:装在fragment的容器
//aFragment:要加载的fragment
// aFragment=new AFragment();
//调用Fragment的一个静态方法newInstance
aFragment=AFragment.newInstance("我是参数");
//把AFragment添加到Activity中,记得调用commit
getSupportFragmentManager().beginTransaction().add(R.id.fl_container,aFragment).commitAllowingStateLoss();
}
2. 在Fragment中传递参数第二步:在ContainerActivity中调用AFragment的静态方法newInstance(),写入参数
关键代码
//传参数的时候:
aFragment=AFragment.newInstance("我是参数");
//不传参数的时候
aFragment=new AFragment();