Fragment

标签: Android


Fragment用法

Fragment是一种可以嵌入在活动中的UI片段。碎片一般都是被引入活动中,比如平板界面使用2个Fragment利用整个平板屏幕,不至于浪费空间和不美观。

Fragment简单用法

定义2个布局文件left_fragment和right—_fragment,如下

<LinearLayout...
    ... />
    <Button
        android:id="@+id/button"
        ... />
</LinearLayout>

再新建LeftFragment类继承Fragment,重写onCreateView方法,加载left_fragment布局文件。RightFragment类类似

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标签,添加Fragment如下

<LinearLayout
    ... />
    <fragment
        android:id="@+id/left_gragment"
        andorid:name="com.example.fragmenttest.LeftFragment"
        android:layout_weight="1"
        ... />
        <fragemnt
            android:id="@+id/right_fragment"
            android:name="...RightFragment"
            android:layout_weight="1"
            ... />

动态添加Fragment

新建Fragment布局文件,以及Fragment类 将right_fragment布局标签改为Fragment布局,用来支持Fragment动态添加

<FrameLayout
    android:id="@+id/right_layout"
    ... />
</FrameLayout>
  1. 创建待添加Fragment实例
  2. 调用getSupportFragmentManager,获取到FragmentManager
  3. 开启事务,beginTransaction方法
  4. 向容器内添加或替换Fragment,replace方法接收2个参数,一个容器id如布局文件id right_layout,和Fragment实例
  5. 提交事务,commit

注意一点,调用addToBackStack方法可以模拟返回栈的功能,即点击Back键后会回到上一个Fragment而不是直接退出程序

Fragment和Activity之间的通信

  1. 活动中可以获取Fragment的实例进而调用方法

    XXXFragment fragment = (XXXFragment) getFragmentManager().findFragmentById(R.id.xxx_fragment);
    
  2. Fragment中获取活动实例

    MainActivity activity = (MainActivity) getActivity();
    

Fragment生命周期

  1. onAttach Fragment和活动建立关联时调用
  2. onCreateView 为fragment创建视图(加载布局)时调用
  3. onActivityCreated 关联的活动创建完毕时调用
  4. onDestroyView 视图被移除时调用
  5. onDetach Fragment和活动解除关联时调用

技巧

使用限定符和最小宽度限定符可以根据设备屏幕大小加载

对于最后的News项目的整体总结

考虑到平板和手机的兼容性,当使用Fragment的时候,建立Fragment布局文件,在Fragment类中加载布局文件。在活动的布局中添加fragment标签并指定android:name="...Fragmemt"。

手机仅加载一个Fragment,而平板还加载了包含在帧布局中的Fragment 手机用活动来显示,新建活动并复用Fragment类,使用fragment标签,在活动布局文件中会自动引入Fragment布局文件。在活动的onCreat方法中获取Fragment实例,并调用Fragment的方法显示数据。

新建Fragment用来显示RecyclerView以及相应的子项布局,通过判断是否能获取帧布局的id,如果是平板双页,加载另一个Fragment,否则则利用Intent启动另一个活动显示内容。