Fragment称之为碎片,可以让程序更加合理充分的利用大屏幕,甚至可以将其理解为一个迷你activity。
一、Fragment的简单使用方法:
1.1 编写Fragment布局文件,与普通布局文件没有区别。
1.2 编写自定义Fragment类,继承自Fragment,重写onCreateView方法,例如:
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;
}
}
1.3 在要使用Fragment的activity布局文件中引入定义好的Fragment,例如:
<fragment
android:id="@+id/right_fragment"
android:name="com.example.fragmenttest.RightFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
这里需要通过name属性显示指定要添加的碎片的类名,一定要将类的包名也加上。
二、动态加载碎片步骤
2.1创建待添加的碎片的实例。
2.2获取FragmentManager,在活动中可以直接调用getFragmentManager()方法得到。
2.3开启一个事务,通过电泳beginTansaction()方法开启。
2.4向容器中加入碎片,一般用replace()方法实现,传入容器的ID和要添加的碎片实例。
2.5提交事务,用commit()实现。
代码示例:
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
AnotherRightFragment fragment = new AnotherRightFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.commit();
break;
default:
break;
}
}
三、在碎片中模拟返回栈
FragmentTansaction提供一个addToBackStack()方法,可以用于将一个事务加入返回栈中,这样在动态加载的碎片时,按back键可以返回上一个碎片而不是直接退出activity。示例如下:
public void onClick(View v) {
switch (v.getId()) {
case R.id.button:
AnotherRightFragment fragment = new AnotherRightFragment();
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.right_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
break;
default:
break;
}
}
四、碎片与活动之间进行通信
为了方便碎片与活动进行通信,Fragmanager提供一个类似于findViewById()的方法,专门用于从布局文件中获取碎片实例,代码如下:
RightFragment rightFragment = (RightFragment)getFragmentManager().findFragmentById(R.id.right_fragment);
在活动中获取了碎片实例,当然可以轻松的调用碎片里的方法。
在碎片中中可以通过getActivity()方法获取当前碎片相关连的活动实例,有了活动实例在碎片中调用活动里的方法就轻而易举了。
MainActivity activity = (MainActivity) getActivity();
五、碎片的生命周期
5.1 碎片的状态与回调
5.1.1 运行状态,当一个碎片可见时,并且它所关联的活动处于运行状态,该碎片也处于运行状态。
5.1.2 暂停状态 当一个活动处于暂停状态时,它所关联的碎片也处于暂停状体。
5.1.3 停止状态 当一个活动进入停止状态时与她关联的碎片也进入停止状态,或者通过调用FragmentTansaction的remove(),replace()方法将碎片移除,但有在事务提交之前并调用addToBackStack()方法,这是碎片也进入停止状态。
5.1.4销毁状态 当一个活动进入销毁状态时与它相关联的碎片也进入销毁状态,或者通过调用FragmentTansaction的remove(),replace()方法将碎片移除,但在事务提交之前没有调用addToBackStack()方法,这是碎片也进入销毁状态。
5.2 常用回调函数
5.2.1onAttach():碎片与活动建立关联的时候调用。
5.2.2onCreateView:位碎片创建(加载)视图时候调用
5.2.3 onActivityCreated()在确保与碎片相关联的活动一定创建完毕的时候调用。
5.2.4 onDestroyedView()当碎片关联的视图被移除的时候调用。
5.2.5onDetach():当碎片与活动解除关联的时候调用。
六、动态加载布局
根据设备的分辨率或者屏幕大小在运行时决定加载哪个布局。
6.1使用限定符
Android常用的限定符:
屏幕大小相关的:
限定符 描述
small 提供给小屏幕的资源;
normal 提供给中等屏幕的资源;
large 提供给大屏幕的资源;
xlarge 提供给超大屏幕的资源;
屏幕分辨率相关的:
限定符 描述
ldpi 提供给分辨率低设备的资源(120dpi以下)
mdpi 提供给中等分辨率设备的资源(120到160dpi)
hdpi 提供给高分辨率设备的资源(120到240dpi)
xhdpi 提供给超分辨率设备的资源(240到320dpi)
与屏幕方向有关的
限定符 描述
land 提供给横屏设备的
Port 提供给竖屏设备的。
6.2 最小宽度限定符
最小宽度限定符允许我们对屏幕宽度指定一个最小值(以dp),为单位,然后以这个最小值为临界点,屏幕宽度大于这个值的设备加载一个布局,而屏幕宽度小于这个值的设备加载另一个布局。
例如 在res目录下新建一个layout-sw600dp文件夹,然后再这个文件夹下新建一个activity_main.xml,当屏幕宽度大于600dp的时候就会加载layout-sw600dp/activity_main.xml布局。