Fragment生命周期
onAttach(Activity):当Fragment和Activity发生关联时使用
onCreateView(LayoutInflater, ViewGroup, Bundle):创建该Fragment的视
onActivityCreate(Bundle):当Activity的onCreate方法返回时调用
onDestoryView():与onCreateView相对应,当该Fragment的视图被移除时调用
onDetach():与onAttach相对应,当Fragment与Activity关联被取消时调用
基本生命周期:onCreate(),onCreateView(),onDestroy(),onDestroyView(),onPause(),onStop(),onResume(),onStart().
FragmentTransaction
FragmentManager manager=getSupportFragmentManager();//创建FragmentManager对象
FragmentTransaction transaction=manager.beginTransaction();//创建FragmentTransaction对象
transaction.add()
//往Activity中添加一个Fragment。
transaction.remove()
//从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()
//使用另一个Fragment替换当前的,如果替换布局则布局会被保留,如果替换Fragment,则之前的Fragment会被销毁。
transaction.hide()
//隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,内存被保留
transaction.show()
//显示之前隐藏的Fragment,配合transaction.hide()使用。
transaction.commit()
//提交修改
注意:每个FragmentTransaction只能被提交一次,即transaction.commit()只能调用一次。若还需使用则需要重写创建FragmentTransaction。
静态创建Fragment
在布局中一定要指定Fragment的name,其值为你创建Fagment的全路径。
<fragment
android:layout_width="match_parent"
android:layout_height="200dp"
android:id="@+id/fragment"
android:name="com.daobao.asus.fragmentdemo.HelloFragment"
android:layout_gravity="center_horizontal"
app:layout_constraintTop_toBottomOf="@id/main_remove"/>
五步法替换和移除Fragment(动态创建Fragment)
如果使用的Fragment继承于V4包下的Fragment则FragmentManager和FragmentTransaction也必须是V4包下的。
public class MainActivity extends AppCompatActivity {
HelloFragment mFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mFragment = new HelloFragment();
}
public void onClick(View view) {
FragmentManager manager=getSupportFragmentManager();//创建FragmentManager对象
FragmentTransaction transaction=manager.beginTransaction();//创建FragmentTransaction对象
switch (view.getId()){
case R.id.main_replace:
//五步法替换fragment
transaction.replace(R.id.main_cl,mFragment);
transaction.commit();
break;
case R.id.main_remove:
transaction.remove(mFragment);
transaction.commit();
break;
}
}
}
监听Fragment的生命周期
在Activity中我们通过FragmentManager来对这个Activity中所有的Fragment生命周期进行监听,其监听的生命周期不用全部复写,只需要重写我们用到的生命周期即可。
/**
* 在activity内监听fragment的生命周期
*/
public void setRegisterFragmentLifecycleCallbacks() {
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.registerFragmentLifecycleCallbacks(new FragmentManager.FragmentLifecycleCallbacks() {
@Override
public void onFragmentResumed(FragmentManager fm, Fragment f) {
super.onFragmentResumed(fm, f);
}
@Override
public void onFragmentPaused(FragmentManager fm, Fragment f) {
super.onFragmentPaused(fm, f);
}
@Override
public void onFragmentCreated(FragmentManager fm, Fragment f, Bundle savedInstanceState) {
super.onFragmentCreated(fm, f, savedInstanceState);
}
@Override
public void onFragmentDestroyed(FragmentManager fm, Fragment f) {
super.onFragmentDestroyed(fm, f);
}
@Override
public void onFragmentAttached(FragmentManager fm, Fragment f, Context context) {
super.onFragmentAttached(fm, f, context);
}//还可以添加其他生命周期的监听
}, false);
}
Activity与Fragment传递参数
Activity向Fragement传递参数时推荐使用Fragment.setArguments 传递参数而不建议使用构造方法来传递参数。
//在Activity中传递参数
HelloFragment mFragment = new HelloFragment();
Bundle bundle = new Bundle();
bundle.putInt("test",1);
mFragment.setArguments(bundle);
//Fragment创建布局时获取参数
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_hello,container,false);
getArguments().getInt("test",0);
return rootView;
}
Fragment配合ViewPager使用
public class MainActivity extends AppCompatActivity {
private ViewPager mViewPager;
private List<Fragment> fragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mViewPager = findViewById(R.id.main_viewpager);
fragments = new ArrayList<>();
fragments.add(new FirstFragment());
fragments.add(new SecondFragment());
fragments.add(new ThirdFragment());
mViewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
@Override
public Fragment getItem(int position) {
return fragments.get(position);
}
@Override
public int getCount() {
return fragments.size();
}
});
mViewPager.setOffscreenPageLimit(2);//设置ViewPager预加载页面个数
}
}