本文共 3563 字,大约阅读时间需要 11 分钟。
Fragment是Android系统从Android 3.0开始引入的核心组件,主要解决以下问题:
Fragment的生命周期设计与Activity类似,主要包括以下阶段:
数据传递是Fragment开发的核心需求。通过Bundle实现高效传递:
public static OneFragment newInstance(int args) { OneFragment fragment = new OneFragment(); Bundle bundle = new Bundle(); bundle.putInt("someArgs", args); fragment.setArguments(bundle); return fragment;}@Overridepublic void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); Bundle bundle = getArguments(); int args = bundle.getInt("someArgs");} 注意事项:setArguments必须在Fragment创建后,添加给Activity前调用,避免先add再设置参数。
FragmentManager fragmentManager = getSupportFragmentManager();FragmentTransaction ft = fragmentManager.beginTransaction();ft.add(R.id.fragment_container, new MyFragment());ft.commit();
优点:简单直观,适合简单的Fragment替换操作
class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm, List fragments) { super(fm, fragments); } @Override public Fragment getItem(int position) { return fragments.get(position); }} FragmentPagerAdapter vs FragmentStatePagerAdapter:
选择哪种适配器取决于Fragment数量和内存需求。
add():添加Fragment到Activityremove():移除Fragmentreplace():替换Fragment(建议使用hide()和show())hide() 和 show():控制Fragment的可见性addToBackStack():添加到回退栈commit():提交事务操作show() 和 hide():仅改变View的可见性,不触发生命周期replace():销毁当前Fragment,重新添加新FragmentFragmentManager维护多个Fragment栈,包括:
getSupportFragmentManager()获取getFragmentManager()或getChildFragmentManager()获取Fragment间通信应通过宿主Activity进行管理,避免直接操作其他Fragment:
public interface FragmentClickListener { void onFragmentClick();}public class OneFragment extends Fragment implements View.OnClickListener { private FragmentClickListener clickListener; public void setClickListener(FragmentClickListener clickListener) { this.clickListener = clickListener; } @Override public void onClick(View v) { clickListener.onFragmentClick(); }} 宿主Activity实现FragmentClickListener接口即可接收Fragment的事件。
onSaveInstanceState保存状态,onCreate恢复创建选择哪种适配器根据Fragment数量和内存需求决定。
getActivity()返回null:可能是Fragment已被detach或Activity已销毁Context context;@Overridepublic void onAttach(Context context) { super.onAttach(context); this.context = context;}class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm, List fragments) { super(fm, fragments); } @Override public Fragment getItem(int position) { return fragments.get(position); }} FragmentManager fm = getChildFragmentManager();mPager.setAdapter(new MyFragmentPagerAdapter(fm, fragmentList));
通过ViewPager实现多Fragment切换,适合Tab 栏式应用。
转载地址:http://myss.baihongyu.com/