Android Fragment 与 Fragment管理器

来源:互联网 发布:平价时尚欧美女装知乎 编辑:程序博客网 时间:2024/06/10 18:54

Android Fragment 与 Fragment管理器

首先谈谈Fragement的需求

过去开发人员认为界面之间的跳转只需要使用多个activity组成就行了;
例如下图中,在Activity-A管理的界面中单击按钮后,Activity-A响应事件并启动Activity-B;而用户在单击后退键会销毁Activity-B 并返回Activity-A界面,如此反复。

但是,如果需要更加复杂的用户界面跳转呢?例如平板设备以及大尺寸手机的屏幕足够大,因此可以同时容纳多个界面(如平板的设置菜单等),又或者用户通过手机查看记录时,希望通过左右滑动来查看上一条/吓一跳记录等情况。

由于Android开发UI设计的灵活性需求,UI设计往往需要适应用户或设备的需求,activity界面在必要时可以在运行时组装或重新组装。但是Activity本身是不具有这样的灵活性,activity视图可以在运行时切换,当控制视图的代码必须在activity中实现;因此activity还是与特定的用户屏幕绑定在一起。

Fragement的引入

首先需要声明一点:Fragement本身并不是视图对象,而是一种控制器对象,activity可委派它处理一些任务。这些任务通常是管理用户界面。

管理用户界面的fragement又称为UI Fragement,它自己也可以产生于布局文件的视图。

一个简单的Fragement例子
  1. 在新建一个空项目后,首先我们要做的就是添加依赖关系:
    在File->Project Structure…菜单中打开项目结构对话框,选择如下图

  2. 点击右上角+号按钮,选择Library dependency界面添加新的依赖项,如下图显示,选择support-v4库

  3. 新建一个Crime类
    文件Crime.java

    import java.util.UUID;//构造函数public class Crime {    private UUID mID;    private String mTitle;    public Crime(){        mID=UUID.randomUUID();    }    public UUID getmID() {        return mID;    }    public String getmTitle() {        return mTitle;    }    public void setmTitle(String mTitle) {        this.mTitle = mTitle;    }}
  4. 创建 UI fragement
    文件frame_layout.xml

    <?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/fragement_container"    android:layout_width="match_parent"    android:layout_height="match_parent">    <EditText        android:id="@+id/container_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:hint="@string/title_hint"/></FrameLayout>
  5. 在初始化的Activity类中进行修改
    文件CrimeActivity.java

    package com.example.administrator.criminalintent;import android.support.v4.app.Fragment;import android.support.v4.app.FragmentActivity;import android.support.v4.app.FragmentManager;import android.os.Bundle;public class CrimeActivity extends FragmentActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.frame_layout);        //添加UI fragment 到ragmentManager        // 获取FragmentManager        FragmentManager fm = getSupportFragmentManager();        /*        如果在上方添加代码出现了错误,请检查导入语句,看看是否导入的是        import android.support.v4.app.*;         */        //fragment事务        //首先,依据R.id.fragement_container向FragmentManager请求并获取fragment        //如果希望获取的fragment已经存在于队列中,则直接返回它。        /*        关于为什么队列中可能存在希望获取的fragment的原因,主要是因为设备在回收内存时,        销毁Android会销毁CrimeActivity;之后重建时,会调用CrimeActivity.onCreate(...)方法。        activity被销毁时,其FragmentManager会保留下来。这样在重建activity时,        新的FragmentManager会首先视图获取保存的队列,然后再重建fragement队列,进而恢复到原来的状态。         */        Fragment fragment = fm.findFragmentById(R.id.fragement_container);        /*        如果指定容器资源ID不存在,则需要新建CrimeFragement,启动新事务并添加到队列中         */        if( fragment == null){            fragment = new CrimeFragement();            fm.beginTransaction()                    .add(R.id.fragement_container,fragment)                    .commit();            /*            add方法是整个事务的核心;            参数1:容器视图资源ID            参数2:新创建的CrimeFragement             */        }    }}
  6. 结果图

作者:黎羽鸿

2017/5/31 12:06:00