- Fragment有自己的生命周期;
- Fragment依赖于Activity;
- Fragment通过getActivity()可以获取所在的Activity;Activity通过FragmentManager的findFragmentById()或findFragmentByTag()获取Fragment;
- Fragment和Activity是多对多的关系。
(1)fragment_a.xml
(2)AFragment.java
(3)Activity_main.xml_点击更换Fragment时,实例化AFragment填充至R.id.fl_container
(4) ContainerActivity.java
public class ContainerActivity extends AppCompatActivity{
private AFragment aFragment;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 实例化一个Fragment
aFragment = new AFragment();
// 把AFragment添加到Activity中,记得调用commit()方法
// 相比于使用commit方法,使用commitAllowingStateLoss不会出现错误
getFragmentManager().beginTransaction().add(this.R.fl_container, aFragment).commitAllowingStateLoss();
}
}
(5)点击更换时将AFragment更换为BFragment
bFragment = new BFragment();
mButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
getFragmentManager().beginTransaction().replace(R.id.fl_container, bFragment);
}
});
}
Fragment中getActivity()为null的问题?
在使用时,先加入一定的判断,当不为空时,再操作并使用。
如何向Fragment传递参数?
提示:通过构造方法的形式进行传递。但实际:无法重写构造方法,通过静态方法创建实例,并设置Bundle参数来完成参数的传递。
public class AFragment extends Fragment{
private TextView textView;
public static AFragment newInstance(String title){
AFragment fragment =new AFragment();
Bundle bundle = new Bundle();
bundle.putString("title", title);
fragment.setArguments(bundle);
return fragment;
}
}
// 实例化一个Fragment
aFragment = AFragment.newInstance("我是参数");
// 把AFragment添加到Activity中,记得调用commit()方法
// 相比于使用commit方法,使用commitAllowingStateLoss不会出现错误
getFragmentManager().beginTransaction().add(this.R.fl_container, aFragment).commitAllowingStateLoss();
Fragment回退栈
在AFragment中, 如果不设置,将会直接返回至Activity的页面。值得注意的是,回退至AFragment时,AFragment不会再被实例化一次,但onCreateView()方法会重新再执行一次,也就是视图将会再实例化一次,视图内容将会丢失。
// 在click之前,将当前的aFragmen添加至回退栈中,这样当按返回键的时候就会返回至上一个Fragment
getFragmentManager().beginTransaction().add(this.R.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss();
那如何实现回退时,依旧保持之前的视图数据呢,通过标签+隐藏Fragment的方式实现。
首次添加AFragment时,设置相关标签:
getFragmentManager().beginTransaction().add(this.R.fl_container, aFragment, "a").commitAllowingStateLoss();
在替换成BFragment时,先隐藏掉带标签的Fragment.再添加新的Fragment.
Fragment fragment = getFragmentManager().findFragmentById("a");
if(fragment != null){
getFragmentManager().beginTransaction().hide(fragment).add(R.id.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss();
}
else{
getFragmentManager().beginTransaction().add(this.R.fl_container, bFragment).addToBackStack(null).commitAllowingStateLoss();
}