Fragment的知识总结:
以前都是自己学习Android,最近实习也学会了不少实用的东西,业余时间也抽出来看看视频什么的。
今天看了几集老罗的第二季视频,发现对Fragment的了解还是不够深刻,下面为自己总结一下Fragment的知识点:
一、Fragment的理解:
Fragment在英文里的意思是碎片,碎片这个词可能还是不够形象,我是这么理解的,Fragment是Activity的子元素,一个
Activity里可以有一个或多个Fragment来模块化的实现界面效果,Fragment是一个可以在多个Activity中重复使用和添加的模块,
每个Fragment都有自己的生命周期,用起来就像是一个封装好的布局,而且是在代码中很轻松就可以实现动态的添加、替换、
删除等操作。
二、Fragment的生命周期:
在这里,Fragment的生命周期可以拿出来和Activity的生命周期进行比较说明:下面先来简单介绍下Activity的生命周期:
Activity的生命周期包括onCreat();onStart();onPause();onStop();onResume();onReStart();onDestory();
Fragment的生命周期包括onAttach();onCreat();onCreatView();onActivityCreated();onStart();onResume();onPause();
onStop();onDestroyView();onDestroy();onDetach();
对于它们两个生命周期关系的理解,我喜欢用这张图表达:
其中和Activity的生命周期有几个不同的方法:
1、onAttach():这个方法是Fragment和Activity关联的时候调用,也就是第一个执行的。
2、onCreate():这个方法是在Fragment这个对象被实例化的时候调用的,里面写的是一些数据和变量。
3、onCreateView():刚开始接触Fragment的时候也迷惑了一段时间,既然有了onCreate()方法了,还要onCreateView()干嘛,
不是多此一举?而且它俩有什么区别?
后来才发现,有好多工作是需要用到Fragment的View的。比如寻找ID,就必须View.findViewById();不然会报null;
4、onActivityCreated():是Activity的onCreated()方法执行完之后调用。当然前提是这个Fragment已经被添加到这个Activity中了。
5、最后的三个onDestoryView()、onDestory()、onDetach()方法看名字也能猜到依次是销毁布局、销毁对象、解绑Activity。
其他的就和Activity的生命周期一样了。
三、Fragment的用法:
在实际使用中,和Fragment有直接关系的关键性类有FragmentManager、FragmentTransaction。FragmentManager顾名思义就是
Fragment的管理器,FragmentTranscation是FragmentManager里的一个可以直接对Fragment操作的工具。具体使用方法如下:
1、创建一个Fragment:
//需要注意的是:android.app.Fragment这个包下的Fragment已经被提示过时了,因为有V4包下的Fragment将它代替了。因为 app包下的Fragment只支持3.0以上的系统,而V4包下的Fragment是可以向下兼容的。这个导包的时候需要注意一下。public class MyFragment extends Fragment { @Override public void onCreate(Bundle savedInstanceState) { // 在这里初始化一下需要的控件和变量 super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { //inflater 是布局构造器 //container 是Fragment默认返回的一个ViewGroup //我们只需要用布局构造器构造出Fragment的布局,然互用addView(view)这个方法添加到ViewGroup中即可。 //也可以直接return view;这样直接返回我们构造的View View view = inflater.inflate(R.layout.layout_fragment, null); container.addView(view); return super.onCreateView(inflater, container, savedInstanceState); } @Override public void onPause() { // 应用暂停的时候,在这里上传保存一些用户数据,因为可能用户就不回来了,以免数据丢失。 super.onPause(); } @Override public void onDestroy() { // 在这里同样是可以上传和保存数据 super.onDestroy(); } } layout_fragment的布局如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:layout_centerInParent="true" android:id="@+id/tv_text" android:background="#00ff00" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="我是一个Fragment" android:textSize="20sp" /> </RelativeLayout></span>
上面的整个类,就相当于创建了一个Fragment,下面我们再来看看怎么在Activity中关联它:
2、添加和替换一个Fragment到Activity的布局中
public class MainActivity extends Activity { private FragmentManager mFragmentManager ; private FragmentTransaction mFragmentTransaction; private MyFragment myFragment ; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //用这种方式获取FragmentManager mFragmentManager = getFragmentManager(); //调用FragmentManager的beginTransaction来获取这个工具对Fragment进行操作 mFragmentTransaction = mFragmentManager.beginTransaction(); //创建MyFragment对象 myFragment = new MyFragment(); //将我们创建的Fragment添加到Activity布局中的FragmentLayout中 mFragmentTransaction.add(R.id.fragment,myFragment,"fragment1"); //用一个新的的Fragment将FragmentLayout中原Fragment给替换掉 //mFragmentTransaction.replace(R.id.fragment,myFragment,"fragment2"); //移除FragmentLayout中的某个Fragment //mFragmentTransaction.remove(myFragment); //这个方法的作用是调用之后,点击返回键,不会返回Activity,而是会返回Fragment的上一个状态。
mFragmentTransaction.addToBackStack(null);
//必须调用这个方法才会有效
mFragmentTransaction.commit();
//这里的fragment1和fragment2是必须添加的一个唯一的Fragment标示
}}
效果图如下: <img src="https://img-blog.csdn.net/20150202194410366?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTYwMTQ0NTk4NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
需要注意的是,添加和替换Fragment的时候,都需要给每个Fragment添加一个唯一的标示,代码中的fragment1和fragment2
即是。
另外,在Activity中可以通过FragmentManager来寻找到添加进去的Fragment,通过Id或者Tag(此处的Tag就是前面添加的)
寻找。
MyFragment fragment1 = (MyFragment) mFragmentManager.findFragmentById(R.id.fragment);
MyFragment fragment2 = (MyFragment) mFragmentManager.findFragmentByTag("fragment1");
activity_main的布局如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.test.MainActivity$PlaceholderFragment" >
<TextView
android:id="@+id/tv_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginTop="30dp"
android:background="#ff0000"
android:text="我是一个Activity"
android:textSize="20sp" />
<FrameLayout
android:layout_centerHorizontal="true"
android:id="@+id/fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tv_activity" >
</FrameLayout>
</RelativeLayout>
至于Fragment强大的效果我这里就不像大家展示了,相信每个人在实际开发中都会用到Fragment来实现动态的、优美的、人性化的UI的。
看完这些大家是不是都发现了原来Fragment用起来这么简单。的确,在我写完这篇博客之后,我也发现了好像是
有点儿简单。。。。
我现在还是一个没毕业的菜鸟,半路出家自学的Android,写博客一是分享给自学的朋友,二是自己总结的时候
也学习到很多,里面有什么错的地方,望大神们不吝赐教。
欢迎转载分享学习!