文章目录
  1. 1. 概念总结
    1. 1.1. 简单实现
    2. 1.2. 动态的添加碎片
    3. 1.3. 碎片中的返回栈
    4. 1.4. 碎片通信
    5. 1.5. 碎片生命周期
    6. 1.6. 使用限定符

概念总结

为了应付Android设备各种尺寸的屏幕,为这些设备提供一个统一的解决方案,Android推出了Fragment组件。一种可以嵌入活动当中的UI片段。Android提供了位于两个不同包下的Fragment对象,android.app.Fragment支持Android4.0以上的版本,另一个包主要是兼容低版本的Android系统。

简单实现

要实现对Fragment的使用,首要需要和普通的UI布局一样声明该Fragment对应的布局,接着新建一个类继承自android.app.Fragment的自定义类,复写其中的onCreateView方法在其中通过LayoutInflater将刚才定义的left_fragment动态的加载进来。下面是一个小例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:orientation="vertical" >


<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="20sp"
android:text="This is right fragment"
/>

</LinearLayout>

继承Fragment并复写其中onCreateView()

1
2
3
4
5
6
7
public class LeftFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.left_fragment, container, false);
return view;
}
}

在布局文件中,可以通过了fragment标签添加碎片,其中通过android:name来制定相应的属性来显式指明要添加的碎片类名

1
2
3
4
5
6
<fragment
android:id="@+id/left_fragment"
android:name="com.example.fragmenttest.LeftFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />

动态的添加碎片

和上面的例子,首先需要声明碎片的布局文件,定义继承了Fragment的类并复写其中的onCreateView方法,在其中加载刚刚声明的布局文件。到这边都和全面一样,下面是在代码中实现动态添加碎片(碎片类名为AnotherRightFragment)

1
2
3
4
5
AnotherRightFragment fragment = new AnotherRightFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();

可以将上面的步骤总结如下:
1.新建一个待添加的碎片实例
2.在活动类中使用getFragmentManager()方法获取fragmentManager对象实例
3.利用fragmentManager对象实例调用beginTransaction方法开启一个事务,传入要替换的组件id和待添加的碎片实例,进行替换操作
4.提交事务

碎片中的返回栈

为了像Activity一样利用backstack实现放回键退回到上一个界面,FragmentTransaction 中提供了一个addToBackStack()方法,可以用于将一个事务添加到返回栈中,只需要在transaction.replace方法后加入,transaction.addToBackStack(null);将这个事务加入到返回栈即可。其中传入的参数用于描述返回栈的名字。

碎片通信

在活动实现与碎片通信是通过FragmentManager的findFragmentById方法,从布局文件相应的组件中获取的碎片类对象。

1
RightFragment rightFragment = (RightFragment) getFragmentManager().findFragmentById(R.id.right_fragment);

在碎片中实现与活动通信使用getActivity方法

1
MainActivity activity = (MainActivity) getActivity();

碎片之间的通信也是通过活动组件,首先在一个活动组件中活动与其相关的活动类,接着利用这个活动去获得另一个碎片即可。

碎片生命周期

首先onAttach()方法(当碎片和活动建立关联的时候调用)、onCreateView()方法(为碎片创建视图(加载布局)时调用)和onActivityCreated()方法(确保与碎片相关联的活动一定已经创建完毕的时候调用),回调完毕时碎片是可见的,他所相关的活动和其本身正处于运行状态。
碎片进入暂停状态是随着活动进如暂停转态,碎片也会进入暂停状态。
碎片进入停止状态的情况有,当活动进入停止状态时、调用了FragmentTransaction的remove和replace方法将碎片移除且在调用的addToBackStack方法。
碎片进入销毁状态的情况有,活动被销毁,调用了FragmentTransaction的remove和replace方法将碎片移除但没有在调用的addToBackStack方法,进入本状态依次回调onDestroyView()方法(当与碎片关联的视图被移除的时候调用)onDetach()方法(当碎片和活动解除关联的时候调用)。
将碎片的生命周期和活动一起考虑,各个函数回调的顺序见下图
image

使用限定符

一个最简单的实现就是将两个相同名称不同内容的视图文件,一个单页模式的用于适应手机屏幕的布局文件存放到layout/目录下,将一个双页模式的用于适应屏幕屏幕的布局文件存放到layout-large/目录下,这样android会自动判断什么屏幕是large,在大屏幕上采用layout-large/目录下的布局文件,下表就是android默认的一些限定符的含义。
image
自定义限定符,只需要新建相应的layout文件夹,如新建了layout-sw600dp/文件夹之后,当程序运行在屏幕宽度大于600dp 的设备上时就会加载layout-sw600dp/文件加下的文件

文章目录
  1. 1. 概念总结
    1. 1.1. 简单实现
    2. 1.2. 动态的添加碎片
    3. 1.3. 碎片中的返回栈
    4. 1.4. 碎片通信
    5. 1.5. 碎片生命周期
    6. 1.6. 使用限定符