Fragment

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布局。








 

原文地址:https://www.cnblogs.com/llxbl/p/6179679.html