Fragment与FragmentManager
来源:互联网 发布:python 最优化求解 编辑:程序博客网 时间:2024/05/16 18:19
Fragment与支持库
在Honeycomb及后续的Android版本中,Activity的所有子类都知道如何管理fragment。而之前版本的Activity则完全不了解fragment,Activity的子类自然也就无从知晓。为兼容较低版本的设备,可继承FragmentActivity类。FragmentActivity是Activity的子类,具有新系统Activity管理fragment的能力,即便是在较早版本的Android设备上也可对fragment进行管理。
Fragment托管的两种方式
在activity中托管一个UI fragment,有如下两种方式:
1、添加fragment到activity布局中;
2、在activity代码中添加fragment。
第一种方式即使用布局fragment。这种方式虽然简单但灵活性不够。添加fragment到activity布局中,就等同于将fragment及其视图与activity的视图绑定在一起,且在activity的生命周期过程中,无法切换fragment视图。
第二种方式是一种比较复杂的托管方式,但也是唯一一种可以在运行时控制fragment的方式。我们可以决定何时将fragment添加到activity中以及随后可以完成何种具体任务;也可以移除fragment,用其他fragment代替当前fragment,然后再重新添加已移除的fragment。我们选择这种方式。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/fragmentContainer" android:layout_width="match_parent" android:layout_height="match_parent"/>
package com.huangfei.criminalintent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;public class CrimeActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_crime); /** * 因为使用了支持库及FragmentActivity类,因此这里调用的方法是getSupportFragmentManager()。如果不考虑Honeycomb以前版本的兼容性问题, * 可直接继承Activity类并调用getFragmentManager()方法。 * * FragmentManager类负责管理fragment并将它们的视图添加到activity的视图层级结构中。 * FragmentManager类具体管理的是: * 1、fragment队列; * 2、fragment事务的回退栈。 */ FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if(fragment == null){ fragment = new CrimeFragment(); /** * 这段代码创建并提交一个fragment事务。 * fragment事务被用来添加、移除、附加、分离或替换fragment队列中的fragment。这是使用fragment * 在运行时组装和重新组装用户界面的核心方式。FragmentManager管理着fragment事务的回退栈。 * * add(容器视图资源ID, 新创建的fragment) * 容器视图资源ID的作用: * 1、告知FragmentManagerfragment视图应该出现在activity视图的什么地方; * 2、是FragmentManager队列中fragment的唯一标识符,见第25行代码’ */ fm.beginTransaction().add(R.id.fragmentContainer, fragment).commit(); } }}
package com.huangfei.criminalintent;import android.os.Bundle;import android.support.v4.app.Fragment;import android.text.Editable;import android.text.TextWatcher;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class CrimeFragment extends Fragment { private TextView mTitleField; private Crime mCrime; /** * Fragment.onCreate(Bundle)是公共方法,而Activity.onCreate(Bundle)是保护方法。因为需要被托管fragment的任何activity调用, * 因此Fragment.onCreate(Bundle)方法及其他Fragment生命周期方法必须设计为公共方法。 * * Fragment.onCreate(Bundle)方法中,并没有生成fragment的视图。虽然在Fragment.onCreate(Bundle)中配置了fragment实例, * 但创建和配置fragment视图是通过Fragment.onCreateView(...)方法完成的。 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mCrime = new Crime(); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { /** * container,视图的父视图,通常我们需要父视图来正确配置组件 * false,告知布局生成器是否将生产的视图添加给父视图。传入false,因为我们将通过activity代码的方式添加视图。 */ View view = inflater.inflate(R.layout.fragment_crime, container, false); mTitleField = (TextView) view.findViewById(R.id.crime_title); mTitleField.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { mTitleField.setText(s.toString()); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void afterTextChanged(Editable s) { } }); return view; }}
Fragment生命周期与FragmentManager
Fragment的生命周期与Activity生命周期的一个关键区别就在于,Fragmen的生命周期方法是由托管activity而不是操作系统调用的。操作系统无从知晓activity用来管理视图的fragment。fragment的使用时activity自己内部的事情。
activity的FragmentManager负责调用队列中fragment的生命周期方法。添加fragment供FragmentManager管理时,onAttach(Activity)、onCreate(Bundle)
以及onCreateView(…)方法会被调用。
代码地址
- Fragment与FragmentManager
- FragmentActivity、Fragment、FragmentPagerAdapter与FragmentManager
- Fragment FragmentManager FragmentTransaction 详解
- Fragment FragmentManager FragmentTransaction 详解
- Fragment如何获得FragmentManager
- Fragment,FragmentManager, FragmentTransaction详解
- 42 Android fragmentManager 获取fragment
- 【Fragment】FragmentManager和FragmentTransaction使用
- Android Fragment 之获取FragmentManager
- Fragment与activity生命周期关系、不同Android版本FragmentManager的差异
- ViewPager+Fragment使用FragmentPageAdapter时app与v4下FragmentManager冲突的解决
- FragmentManager与FragmentTransaction
- FragmentManager与FragmentTransactioin
- FragmentManager , FragmentActivity 和 Fragment、Activity的区别?
- "Traditional ViewPager", "FragmentManager & Fragment"的用法
- Android Tab实现之FragmentManager+Fragment
- Fragment,Activity,FragmentManager之间那点事
- Android Fragment(二)之获取FragmentManager
- C++静态成员函数小结(转)
- C++已经丧失了昔日的辉煌
- 2015年终总结(一)
- 程序包com.sun.image.codec.jpeg不存在
- 对几种常见设计模式的理解
- Fragment与FragmentManager
- 程序员——伤不起的三十岁
- 动态规划—最优二叉搜索树
- 回首大学时代
- Python爬虫学习记录(2)——LDA处理歌词
- Linux下播放rmvb的问题解决
- DES、AES、RSA加密解密
- 计算机科学利用邮件订阅或RSS来关注state-of-art
- 生成微信公众号关注二维码