• fragment


    fragment 是一种控制器对象,activity 可以委派它执行任务,这些任务通常是管理用户界面,受管理的用户界面可以是一整屏也可以是整屏的一部分。

    现在,Google有两个版本的 fragment 实现可供选择:

      原生版本:内置在设备系统中,如果应用要支持各个系统版本,在不同设备上运行的 fragment 可能会有不同的表现,

              这主要是因为各个版本的维护有差异,例如某个 bug 在 4.4 系统版本里已修正,而在 4.0 里确没有。

      支持库版本:使用类库,应用发布时,会打包在应用里,这样无论在哪个系统版本的设备上运行,都会有相同的表现。

            fragment 的支持库版本来自于 AppCompat 库,Google 为开发者提供了很多兼容库,这是其中一个。

     

    添加 fragment 支持库:

    要使用 AppCompat 支持库,项目必须将其列入依赖关系:

    打开应用模块下的 build.gradle 文件(每个项目都有两个 build.gradle 文件,一个用于整个项目(位于根目录下),一个用于应用模块(位于 app 目录下)):

    apply plugin: 'com.android.application'
    
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"
        defaultConfig {
            applicationId "com.example.criminalintent"
            minSdkVersion 19
            targetSdkVersion 25
            versionCode 1
            versionName "1.0"
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
        buildTypes {
            release {
                minifyEnabled false
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    }
    
    dependencies {
        //表示依赖的 jar 包位于 app/libs 目录下。
        compile fileTree(dir: 'libs', include: ['*.jar'])
        androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
            exclude group: 'com.android.support', module: 'support-annotations'
        })
        //添加appcompat支持库,格式使用了 Maven 坐标模式:groupId:artifactId:version
        compile 'com.android.support:appcompat-v7:25.3.1'
        compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
        testCompile 'junit:junit:4.12'
    }

    Android Studio在创建项目时,会自动引入一些依赖库,appcompat库一般已经包含在内了。

    Gradle允许设置未复制到项目中的依赖项,应用编译时,Gradle会找到并下载指定的依赖包,并将其自动导入到项目中,我们只需要在配置中写好指令,剩下的交个Gradle就好了。

     

    使用Android Studio提供的工具添加支持库:

    1. 选择 File -> Project Structure ... 菜单项,打开项目结构对话框


    选择左边的应用模块,然后右边选择Dependencies选项(应用模块的依赖项都在这里了):

     


    3. 点击右上角的 + 按钮,选择 Library dependency 界面添加新的依赖项:

     

    搜索选择需要添加的依赖项,点击 OK 就可以了,回到 app/build.gradle 文件,就可以看到选择的依赖已经成功添加到文件中了。

    如果手动修改了 app/build.gradle 文件,就需要同步项目和 Gradle 文件以更新修改内容。同步就是要求 Gradle 通过下载或删除依赖项,基于修改重新编译。

    选择 Tools -> Android -> Sync Project with Gradle Files 菜单项可以手动执行同步。

     

     托管 fragment 的 activity 必须完成以下两个任务:

      1. 在 activity 的布局中为 fragment 的视图安排位置

        (1): 在 activity 的布局文件中添加 fragment

            这种方式简单但不够灵活,相当于将 fragment 及其视图与 activity 的视图绑定在一起,并且在 activity 的生命周期过程中,无法替换 fragment 视图。

        (2): 在 activity 的代码中添加 fragment

            这种方式比较复杂,但是可以动态的控制 fragment。

      2. 管理相应 fragment 实例的生命周期

    fragment的生命周期:

      类似于 activity 的生命周期,fragment 也具有停止状态,暂停状态,和运行状态。fragment 中许多方法对应着 activity 的生命周期方法,

    这种对应非常重要,因为 fragment 代替 activity 工作,所以它的状态应该反映相应 activity 的状态。

      fragment 生命周期与 activity 生命周期的一个关键区别在于,fragment 的生命周期方法由托管的 activity 调用,而不是操作系统。

     

    fragment 的生命周期图解:

      1. 运行状态

        当一个 fragment 是可见的,并且它所关联的 activity 正处于运行状态时,该 fragment 也处于运行状态。

      

      2. 暂停状态

        当一个活动进入暂停状态时(由于另一个未占满屏幕的活动被添加到了栈顶),与它相关联的可见 fragment 就会进入暂停状态。

      3. 停止状态

        当一个活动进入停止状态时,与它相关联的 fragment 就会进入到停止状态;或者通过调用 Transaction 的 remove()、replace() 方法将 fragment 从活动中移除。

        但如果在事务提交之前调用 addToBackStack() 方法,这时的 fragment 也会进入到停止状态。进入停止状态的 fragment 对用户来说是完全不可见的,有可能被系统回收。

      4. 销毁状态

        fragment 总是依附于 activity 而存在的,因此当 activity 被销毁时,与它相关联的 fragment 就会进入到销毁状态;或者在事务提交之前并没有调用 addToBackStack() 方法将

        事务添加到返回栈中,这时的 fragment 也会进入到销毁状态。

    Fragment 中的附加方法:

      onAttach() : 当 fragment 或 activity 建立关联的时候调用

      onCreateView() : 为 fragment 创建视图(加载布局)时调用

      onActivityCreated() : 确保与 fragment 关联的 activity 一定已经创建完毕时调用

      onDestroyView() : 当与 fragment 关联的视图被移除时调用

      onDetach() : 当 fragment 和 activity 解除关联时调用

    创建 UI fragment:  

      创建 UI fragment 的步骤和创建 activity 的步骤相同:

        1. 定义用户界面布局文件

        2. 创建 fragment 类,并设置其视图为定义的布局

        3. 编写代码实例化组件

     使用 Android Studio 创建 fragment 类:

      1. 选择要创建 fragment 类文件的包,右键单击,选择 New -> Fragment -> Fragment (Blank):

      2.  编辑要创建的 Fragment 类文件的名字,然后点击 Finish:

     


    Android Studio 会自动帮我创建好 fragment 类文件,并在 res/layout 目录下自动创建好对应的布局文件。

    在 activity 对象中使用 fragment:

       @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_crime);
    
            //获取 FragmentManager 对象
            FragmentManager fm = getSupportFragmentManager();
            /*
            * 通过 fragment 的视图资源ID,从 FragmentManager 对象中获取指定的 fragment 对象
            *
            * 为什么要获取的 fragment 对象可能已经有了?
            *   当设备旋转或内存回收时,Android 系统会销毁 fragment 所在的 activity,然后重建。
            *   activity 被销毁时,它的 FragmentManager 会将 fragment 队列保存下来。这样,当 activity
            *   重建时,新的 FragmentManager 会首先获取保存的队列,然后重建 fragment 队列,从而回复原来的状态。
            * */
            Fragment fragment = fm.findFragmentById(R.id.fragment_container);
            //判断获取的 fragment 对象是否存在
            if (fragment == null) {
                //如果获取的 fragment 对象不存在,则新建对应的 fragment 对象
                fragment = new CrimeFragment();
    
                /*
                * 使用 FragmentManager 对象开启 fragment 事务,通过对应的 fragment 对象的视图资源ID添加 fragment 对象
                *
                * fragment 事务被用来添加,移除,附加,分离或替换 fragment 队列中的 fragment 。
                * 这是使用 fragment 动态组装和重新组装用户界面的关键。FragmentManager 管理着 fragment 事务回退栈。
                * */
                fm.beginTransaction()
                        .add(R.id.fragment_container, fragment)
                        .commit();  //提交事务
            }
    
        }

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    1015,存储过程,视图
    1009,数据库查询,聚合函数,日期时间函数
    1008,数据库表格创建,名称,格式

    公历和农历转换的JS代码
    面向对象之封装
    HTML之锚点
    HTML之css+div
    HTML基础
    SQL之定义变量
  • 原文地址:https://www.cnblogs.com/yingtoumao/p/8583370.html
Copyright © 2020-2023  润新知