1.Fragment 的基本了解
1.1 什么是Fragment
Fragment是Android3.0后引入的一个新的API,他出现的初衷是为了适应大屏幕的平板电脑, 当然现在他仍然是平板APP UI设计的宠儿,普通手机开发也会加入这个Fragment, 我们可以把他看成一个小型的Activity,又称Activity片段(碎片)!
如果一个很大的界面,我们 就一个布局,写起界面来会有多麻烦,而且如果组件多的话是管理起来也很麻烦!而使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理!从而可以更加方便的在 运行过程中动态地更新Activity的用户界面!
另外Fragment并不能单独使用,他需要嵌套在Activity 中使用,尽管他拥有自己的生命周期(见下文图2),但是还是会受到宿主Activity的生命周期的影响,比如Activity 被destory销毁了,它也会跟着销毁!
Fragment分别对应手机与平板间不同情况的处理图:
1.2Fragment的生命周期
①Activity加载Fragment的时候,依次调用下面的方法: onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart ->onResume
②当我们弄出一个悬浮的对话框风格的Activity,或者其他,就是让Fragment所在的Activity可见,但不获得焦点 onPause
③当对话框关闭,Activity又获得了焦点: onResume
④当我们替换Fragment,并调用addToBackStack()将他添加到Back栈中 onPause -> onStop -> onDestoryView !!注意,此时的Fragment还没有被销毁哦!!!
⑤当我们按下键盘的回退键,Fragment会再次显示出来: onCreateView -> onActivityCreated -> onStart -> onResume
⑥如果我们替换后,在事务commit之前没有调用addToBackStack()方法将 Fragment添加到back栈中的话;又或者退出了Activity的话,那么Fragment将会被完全结束, Fragment会进入销毁状态 onPause -> onStop -> onDestoryView -> onDestory -> onDetach
1.3 Fragment的核心要点:
- 注意:为了更好的兼容性,建议用App包下的V4包!而选择了V4包,要注意一下:
- ①如果你使用了v4包下的Fragment,那么所在的那个Activity就要继承FragmentActivity哦! 案例:今天在xml文件中静态地载入fragment,然后重写了Fragment,但是在加载Activity的时候就报错了, 大概的提示就是Fragment错误还是找不到什么的,name属性改了几次还是错!最后才发现是用了 v4的包的缘故,只需让自己的Activity改成FragmentActivity即可!
- 如果还有报错,只需要把getFragmentManager( )改成getSupportFragmentManager( )就可以了
- 3.0版本后引入,即minSdk要大于11
- Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套 的Fragment也是需要嵌套在Activity中的,间接地说,Fragment还是需要嵌套在Activity中!! 受寄主Activity的生命周期影响,当然他也有自己的生命周期!另外不建议在Fragment里面 嵌套Fragment因为嵌套在里面的Fragment生命周期不可控!!!
- 官方文档说创建Fragment时至少需要实现三个方法:onCreate( ),onCreateView( ),OnPause( ); 不过貌似只写一个onCreateView也是可以的...
- Fragment的生命周期和Activity有点类似:三种状态:
Resumed:在允许中的Fragment可见
Paused:所在Activity可见,但是得不到焦点
Stoped: ①调用addToBackStack(),Fragment被添加到Bcak栈 ②该Activity转向后台,或者该Fragment被替换/删除
ps:停止状态的fragment仍然活着(所有状态和成员信息被系统保持着),然而,它对用户 不再可见,并且如果activity被干掉,他也会被干掉.
1.4 Fragment的几个子类:
- DialogFragment(对话框:)
- ListFragment(列表:)
- PreferenceFragment(选项设置)
- WebViewFragment(WebView界面:)
--------------------------------------------------------------------------------
2.Fragment 上手demo
先建一个Activity
xml代码(activity_main.xml)):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.chauncynong.day14_class0115_lp.MainActivity">
<!--
1.id
2.class 会继承 Frament
3.关联 class/name
-->
//static create
<fragment
class="com.example.chauncynong.day14_class0115_lp.fragment.MyFragment01"
android:tag="MyFragment01"
android:layout_width="match_parent"
android:layout_height="300dp"
tools:layout="@layout/fragment01" />
<!--
live create
1.create container(LinearLayout or RelativiLayout)
2.java Activity
-->
<RelativeLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="200dp"
/>
<LinearLayout
android:orientation="horizontal"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<Button
android:id="@+id/btn1"
android:onClick="fm1"
android:text="页面1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<Button
android:id="@+id/btn2"
android:onClick="fm1"
android:text="页面2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
java代码(MainActivity.java))
package com.example.chauncynong.day14_class0115_lp;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import com.example.chauncynong.day14_class0115_lp.fragment.MyFragment02;
public class MainActivity extends AppCompatActivity {
MyFragment02 myFragment02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//1.new
myFragment02 = new MyFragment02();
//2.manager
FragmentManager manager = getSupportFragmentManager();
//3.Transaction
FragmentTransaction ft = manager.beginTransaction();
ft.add(R.id.container,myFragment02);
//4.submit
ft.commit();
}
}
2-1)静态加载Fragment
实现流程:
<?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" android:background="@color/colorAccent"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="32sp" android:text="I'm static create Fragment!" /> </LinearLayout>java代码:
public class MyFragment01 extends Fragment {
/**
*
* @param inflater 布局
* @param container 容器
* @param savedInstanceState 保存临时的状态
* @return
*/
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment01,container,false);
return view;
}
}
2-2)动态加载Fragment
<LinearLayout 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"
android:background="#49d736"
tools:context="com.example.chauncynong.day14_class0115_lp.fragment.MyFragment02">
<!-- TODO: Update blank fragment layout -->
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="30dp"
android:text="I'm live created fragment" />
</LinearLayout>
public class MyFragment02 extends Fragment {
public MyFragment02() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_my_fragment02, container, false);
}
}