Fragment与Activity《android初开发探索(二)》通用基础Fragment编写
以下内容与思考大多参考自《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的生命周期
如下图,Fragement的生命周期先经历了onAttach()、onCreate()、onCreateView(),这三个方法会在Fragment所寄生的Activity生成视图时依次被调用;其次是onActivityCreated(),即Fragment被创建时调用;然后是onStart()、onResume();如果Fragment进入了暂定状态,在真正暂定之前,Fragment会调用onPause()方法,恢复时调用onResume;如果Fragment进入了停止状态,会在真正停止之前,调用onStop()方法,恢复时调用onStart();从下图的逻辑中我们可以看出,无论是暂定后恢复还是停止后恢复,Fragment都会经历onResume(),而不一定会经历onStart()。
了解了Fragment的生命周期,我们就能更好的判断什么逻辑处理应在哪个阶段执行、写在哪个重写方法体内了。
在Activity中创建Fragment的基础通用方法
首先在Android studio中新建一个项目,File-new-new project
修改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寻找它的视图要出现的地方。
有更多的理解或想法请在下方评论探讨,欢迎批评指正!