碎片是一种可以嵌入在活动当中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛。它和活动很像,能包含布局,有自己的生命周期,可以将它理解成一个迷你型活动。
一个 fragment 必须总是绑定到一个 activity 中,并且被它的宿主 activity 的生命周期直接影响(fragment 行为有点像自然界里面的寄生植物了,它有自己的生命周期,但是如果它的宿主植物挂掉的话,fragment 自己也会挂掉)。比如,当一个 activity 暂停的时候,它里面所有的 fragments 也同样暂停,当 activity 销毁的时候,它里面所有的 fragment 同样也被销毁。然而,当一个活动正在运行(它处于 resumed 生命周期的时候),我们可以独立的操纵每个 fragment 执行注入添加和移除它们。
(1)首先,需要构造 Fragment 的布局文件 xml;例如,分别构建两个 xml 文件,right_layout.xml 和 left_layout.xml。
(2)然后,需要构建容纳 Fragment 布局文件的 LeftFragment 类和 RightFragment 类,这两个类都继承 Fragment,并重写 Fragment 中的onCreateView()
方法,在其中引入上面的两个布局。
public class LeftFragment extends Fragment {
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment,container,false);
return view;
}
}
(3)在主布局中使用
标签在布局中添加碎片,就想使用普通控件一样。注意这里还需要通过 android:name 属性来显式指明要添加的步骤(2)当中的碎片的类名,一定要将类的包名也加上。
id="@+id/left_fragment"//id不能忘
android:name="com.example.fragmenttest.LeftFragment"//要写全名!
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
(1)跟上面一样新建另一个右侧碎片布局和一个 AnotherRightFragment 类,继承 Fragment ,重写onCreateView()
,引入布局。
(2)修改 activity_main.xml ,将右侧 fragment 放在一个
当中
<FrameLayout android:id="@+id/right_layout" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" >
<fragment android:id="@+id/right_fragment" android:name="com.example.fragmenttest.RightFragment" android:layout_width="match_parent" android:layout_height="match_parent" />
FrameLayout>
(3)在 MainActivity 中给左侧 fragment 的按钮注册一个点击事件,然后将动态添加碎片的逻辑都放在点击事件里进行。动态添加碎片主要分为五步:
AnotherRightFragment fragment = new AnotherRightFragment();
getFragmentManager()
方法获得FragmentManager fragmentManager = getFragmentManager();
beginTransaction()
方法开启FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
replace()
方法实现fragmentTransaction.replace(R.id.right_layout,fragment);
fragmentTransaction.commit();
FragmentTransaction 中提供了一个addToBackStack()
方法,可以用于将一个事务添加到返回栈中,
fragmentTransaction.addToBackStack(null);//方法接收一个名字用于描述返回栈的状态,一般为null
这样点击 Back 按钮就会返回到上一个 Fragment 界面而不是退出程序。
(1)把类继承改为 Activity
如果 FragmentManager 来自 Android.app.FragmentManager,把继承类改为Activity,这样addToBackStack (null)
是有效的,按返回键的时候会返回上一个碎片。
(2)若类继承 AppCompatActivity (来自 android.support.v7.app.AppCompatActivity 包),则 Fragment 必须来自 v4 包,还有将getFragmentManager()
方法改为getSupportFragmentManager()
方法,这样addToBackStack (null)
是有效的。
! 感觉是要使用来自同一个包或者兼容的包才有效。
(1)从布局中获取碎片的实例,获得后就能调用碎片里的方法:
RightFragment rf = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);//注意是findFragmentById
(2)从碎片中获取布局的实例,获得后就能调用布局里的方法:
MainActivity activity = (MainActivity) getActivity();
Button button = (Button) activity.findViewById(R.id.button);//从而可以获得当中的button
(3)碎片之间的通信
首先在一个碎片可以得到与它相关联的活动,再通过这个活动去获取另外一个碎片的实例,这样子实现碎片之间的通信。