欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Fragment与Activity《android初开发探索(二)》通用基础Fragment编写

程序员文章站 2022-05-14 08:03:40
...

以下内容与思考大多参考自《Android编程权威指南》
更多请进以下链接:“图灵社区”参与交流探讨

http://forums.bignerdranch.com

简介

如同我上一篇文章中使用Fragment制作拥有底部导航栏的界面那般,Fragment实际上是嵌入Activity当中,正如它的中文翻译一般,碎片,只是Activity中的一部分,利用Fragment,我们不仅可以制作拥有底部导航栏的界面,还可以实现很多功能,例如许多参考资料中使用Fragment制作类似新闻标题列表与具体内容在平板上能同时显示一般。相信小伙伴们对Fragment具有更深的理解后,能够实现更多意想不到的功能

关系

如下图,最外框为一个Activity,一个Activity中可以放置多个Fragment,前提是Activity要给这些Fragment预留位置,而如何预留位置,如排版如何,何种条件下显示,以何种状态显示等,几乎决定了你使用Fragment所表达出来的样式效果。
Activity的生命周期依赖于操作系统,而Fragment是寄生于Activity的,没有Activity就没有Fragment,Fragment的生命周期依赖于Activity
Fragment与Activity《android初开发探索(二)》通用基础Fragment编写

生命周期

何为生命周期

相信有不少小伙伴和我最开始一样,不理解什么是生命周期,但是理解开发过程中出现的各种专业术语是不可或缺的,有助于你更快的学习以及整体了解开发过程。那么首先解释一下何为生命周期,即一个实例、或一个对象等从它诞生到消亡经历的各个阶段。可以简单理解为一个人从出生到死亡,要经过婴儿、儿童、青年、成年、老年这样的生命周期一般,不同的是,开发过程中的对象的生命周期的各个阶段可能出现不止一次,而人只有一次。

Fragment的生命周期

如下图,Fragement的生命周期先经历了onAttach()、onCreate()、onCreateView(),这三个方法会在Fragment所寄生的Activity生成视图时依次被调用;其次是onActivityCreated(),即Fragment被创建时调用;然后是onStart()、onResume();如果Fragment进入了暂定状态,在真正暂定之前,Fragment会调用onPause()方法,恢复时调用onResume;如果Fragment进入了停止状态,会在真正停止之前,调用onStop()方法,恢复时调用onStart();从下图的逻辑中我们可以看出,无论是暂定后恢复还是停止后恢复,Fragment都会经历onResume(),而不一定会经历onStart()。
了解了Fragment的生命周期,我们就能更好的判断什么逻辑处理应在哪个阶段执行、写在哪个重写方法体内了。
Fragment与Activity《android初开发探索(二)》通用基础Fragment编写

在Activity中创建Fragment的基础通用方法

首先在Android studio中新建一个项目,File-new-new project
Fragment与Activity《android初开发探索(二)》通用基础Fragment编写
修改activity_main的代码如下

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
</FrameLayout>

我们的目的是,以MainActiviy为寄生Activity,往其中添加寄生于它的Fragment,而activity_main主布局即是容纳Fragment视图的容器布局,赋予容器布局id,因为要通过代码的方式添加Fragment视图,该方法具有高灵活性。

修改MainActivity代码

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

这里我们导入支持库support.v4.app.FragmentActivity。导入支持库中的Activity而不使用android原生自带的FragmentActivity,是为了我们的应用具有更好的兼容性。
这样,我们的寄生Activity以及容器布局就准备好了,接下来编写要寄生进来的Fragment。
新建Fragment的视图布局文件fragment1
内容随个人喜好,这里从简

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="hello akiter"/>
</LinearLayout>

然后新建与该布局关联的Fragment类Fragment1

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment{
    private View view;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        super.onCreateView(inflater, container, savedInstanceState);
        view = inflater.inflate(R.layout.fragment1,null);
        return view;
    }
}

这里我们重写onCreateView()方法,结果是返回我们所建的fragment的视图布局文件fragment1。
接下就是在MainActivity中获取到要寄生于它的Fragment,回到MainActivity,在onCreate中添加如下代码

FragmentManager fm = getSupportFragmentManager();
        Fragment fragment = fm.findFragmentById(R.id.fragment_container);
        
        if(fragment == null){
            fragment = new Fragment1();
            fm.beginTransaction()
                    .add(R.id.fragment_container,fragment)
                    .commit();
        }

我们使用Fragment时一般都是使用多个,而多个Fragment自然需要一个管理者,所谓不能群龙无首,所以我们需要获取到Fragment管理器:FragmentManager

FragmentManager fm = getSupportFragmentManager();

在Fragmentmanager中,通过容器视图的资源ID告诉fragment它的视图应该出现在什么地方。

小结

以上便是在Activity中寄生Fragment的通用基础逻辑方法了,你可以通过在容器视图中建立更多的子布局,作为更多的Fragment视图要出现的地方,要记得Fragment是通过资源ID寻找它的视图要出现的地方。
有更多的理解或想法请在下方评论探讨,欢迎批评指正!