Fragment 设计初衷
Fragment 在 android 3.0 版本增加,先看下官方怎么定义的
Android introduced fragments in Android 3.0 (API level 11), primarily to support more dynamic and flexible UI designs on large screens, such as tablets. Because a tablet's screen is much larger than that of a handset, there's more room to combine and interchange UI components. Fragments allow such designs without the need for you to manage complex changes to the view hierarchy. By dividing the layout of an activity into fragments, you become able to modify the activity's appearance at runtime and preserve those changes in a back stack that's managed by the activity
目的:解决大屏适配的问题,可以更加灵活的处理 UI 交互,同时支持与 Activity 的比较复杂的交互方式。
关键生命周期
Fragment 组件本身有严格的生命周期回调,同时与所在的 host Activity 有关。
- onCreate
- onCreateView
- onResume
Fragment 作为一个 View,被添加到 ViewGroup 中。
Fragment 添加方式
- 静态添加
- 动态加载
- 静态添加,在 xml 文件中,固定好 Fragment 的 路径和对应的 Fragment 类,加载项目了的时候自动解析。
- 动态加载,在运行期间决定,具体需要加载哪个 Fragment,同时可以根据不同的状态,对要加载的 Fragment 传入不同的参数。
推荐使用动态加载的方案,更加灵活。
Fragment 管理相关的类
- FragmentManager
- FragmentTransaction
FragmentManager 负责管理 Activity 中的Fragment,通过 getSupportFragmentManager 方法获取。
- 查找当前 Activity 管理的 Fragment,findFragmentById、findFragmentbyTag 等。
- 管理 Fragment 状态与返回栈的关系,通过 popBackStack()或 addOnBackStackChangedListener()
FragmentTransaction 直接操作 Fragment,可以 add、remove、replace 操作,最后通过 commit 提交,提交的时候,可以选择是否将该操作添加到返回栈中 addToBackStack 。BackStack的管理有 Activity 负责,这里可以与 Fragment 的状态关联。
看一下 替换 Fragment 的代码示例
// Create new fragment and transactionFragment newFragment = new ExampleFragment();FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();// Replace whatever is in the fragment_container view with this fragment,// and add the transaction to the back stacktransaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);// Commit the transactiontransaction.commit();
Fragment 与 Activity/Fragment 数据交互
Fragment 本身是 host Activity 的一个成员,Activity 可以通过 FragmentManager,找到对应的 Fragment 引用,有实例化后的引用,可以通过定义接口方法交互。
- FragmentA 中定义接口
- Activity 中实现接口
public static class FragmentA extends ListFragment { ... // Container Activity must implement this interface public interface OnArticleSelectedListener { public void onArticleSelected(Uri articleUri); } ...} OnArticleSelectedListener listener; ... @Override public void onAttach(Context context) { super.onAttach(context); try { listener = (OnArticleSelectedListener) context; } catch (ClassCastException e) { throw new ClassCastException(context.toString() + " must implement OnArticleSelectedListener"); } } ... @Override public void onListItemClick(ListView l, View v, int position, long id) { // Append the clicked item's row ID with the content provider Uri Uri noteUri = ContentUris.withAppendedId(ArticleColumns.CONTENT_URI, id); // Send the event and Uri to the host activity listener.onArticleSelected(noteUri); }
这样被点击的新闻 Uri 就传递给了 hostActivity。
Activity 与Fragment 生命周期
Activity 与 Fragment 生命周期的回调,有严格的对应关系。
先看图
- Activity 的 onCreate,对应着 Fragment 的 onCreate、onCreateView、onActivityCreated
- Activity 创建成功,进入 onResume 状态,同步 Fragment 进入 onResume 状态
- Activity 暂停时,Fragment 进入暂停状态
- Activity 被销毁时,Fragment 的 view 先回调 onDestroy 方法,再回调 onDetach。
最后,用一张图总结一下
#Android#