学习笔记(五)探究碎片 Fragment 之一

一. 什么是碎片 Fragment ?

  碎片是一种可以嵌入在活动当中的 UI 片段,它能让程序更加合理和充分地利用大屏幕的空间,因而在平板上应用的非常广泛。它和活动很像,能包含布局,有自己的生命周期,可以将它理解成一个迷你型活动。
  一个 fragment 必须总是绑定到一个 activity 中,并且被它的宿主 activity 的生命周期直接影响(fragment 行为有点像自然界里面的寄生植物了,它有自己的生命周期,但是如果它的宿主植物挂掉的话,fragment 自己也会挂掉)。比如,当一个 activity 暂停的时候,它里面所有的 fragments 也同样暂停,当 activity 销毁的时候,它里面所有的 fragment 同样也被销毁。然而,当一个活动正在运行(它处于 resumed 生命周期的时候),我们可以独立的操纵每个 fragment 执行注入添加和移除它们。

二. 碎片的使用方法

1. 简单的用法

(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)在主布局中使用<fragment> </fragment>标签在布局中添加碎片,就想使用普通控件一样。注意这里还需要通过 android:name 属性来显式指明要添加的步骤(2)当中的碎片的类名,一定要将类的包名也加上。

<fragment
    android:id="@+id/left_fragment"//id不能忘
    android:name="com.example.fragmenttest.LeftFragment"//要写全名!
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1" />

2. 动态添加碎片

(1)跟上面一样新建另一个右侧碎片布局和一个 AnotherRightFragment 类,继承 Fragment ,重写onCreateView(),引入布局。
(2)修改 activity_main.xml ,将右侧 fragment 放在一个<FrameLayout> </FrameLayout>当中

<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();
  • 获取 FragmentManager ,直接调用getFragmentManager()方法获得
FragmentManager fragmentManager = getFragmentManager();
  • 开启事务 FragmentTransaction ,调用beginTransaction()方法开启
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  • 向容器加入 Fragment ,该容器为(2)中的 FrameLayout ,使用replace()方法实现
fragmentTransaction.replace(R.id.right_layout,fragment);
  • 提交事务
fragmentTransaction.commit();

3. 在碎片中模拟返回栈

  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)是有效的。

! 感觉是要使用来自同一个包或者兼容的包才有效。

4. 活动与碎片之间相互通信

(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)碎片之间的通信
  首先在一个碎片可以得到与它相关联的活动,再通过这个活动去获取另外一个碎片的实例,这样子实现碎片之间的通信。

你可能感兴趣的:(android,学习笔记)