Fragment(碎片)
概念:Fragment在应用的扮演的是模块化、可重用的角色。Fragment定义了自己的布局,以及通过它自己的生命周期回调方法定义了它自己的行为,你可以将Fragment包含在多个activity中。
Activity和Fragment的关系:
Activity----Fragment
房子 ---- 房间
Fragment知识概要
1.Fragment可以作为activity界面的一部分组成出现
2.一个activity中可以放置多个Fragment,而且一个Fragment也可以在多个activity中复用
3.可以在activity运行时动态的添加、删除、替换Fragment
4.Fragment有自己的生命周期,它的生命周期和所在activity的生命周期有一定的关联
详细解读每个方法的调用场景
onAttach方法
Fragment和Activity建立关联的时候调用(获得activity的传递的值)
onCreateView方法
为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局,可以使用线程更新UI)
onActivityCreated方法
当Activity中的onCreate方法执行完后调用(表示activity执行oncreate方法完成了的时候会调用此方法)
onDestroyView方法
Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局)
onDetach方法
Fragment和Activity解除关联的时候调用(脱离activity)
fragment生命周期解析
当一个fragment被创建的时候:
onAttach()
onCreate()
onCreateView()
onActivityCreated()
当这个fragment对用户可见的时候,它会经历以下状态。
onStart()
onResume()
当这个fragment进入“后台模式”的时候,它会经历以下状态。
onPause()
onStop()
当这个fragment被销毁了(或者持有它的activity被销毁了):
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
就像Activity一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。
onCreate()
onCreateView()
onActivityCreated()
其他场景的调用
屏幕灭掉
onPause() onSaveInstanceState() onStop()
屏幕解锁
onStart() onResume()
切换到其他Fragment
onPause() onStop() onDestroyView()
切换回本身的Fragment
onCreateView() onActivityCreated() onStart() onResume()
回到桌面
onPause() onSaveInstanceState() onStop()
回到应用
onStart() onResume()
退出应用
onPause() onStop() onDestroyView() onDestroy() onDetach()
Fragment的使用
由于Fragment作为Activity的一部分,所以Fragment的使用一般是添加到Activity中,一般有两种方法将Fragment添加到Activity中:
方法1:在activity的layout.xml文件中声明fragment
方法2:在activity的layout.xml文件中声明包含
方法1
layout文件fragment_layout_test.xml
<fragment android:name=“com.skywang.app.FragmentLayoutTest$ExampleFragment”
android:id="@+id/list"
android:layout_weight=“1”
android:layout_width=“match_parent”
android:layout_height=“match_parent”/>
说明
- 该layout只包含了一个fragment元素。
- fragment的属性
android:name=“com.skywang.app.FragmentLayoutTest$ExampleFragment”
说明该fragment是定义在包名为”com.skywang.app”中类”FragmentLayoutTest”“的内部类”ExampleFragment”中的。
FragmentLayoutTest.java
package com.skywang.app;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.view.LayoutInflater;
import android.widget.TextView;
import android.app.Fragment;
public class FragmentLayoutTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// fragment_layout_test只包括ExampleFragment对象。
setContentView(R.layout.fragment_layout_test);
}
// 继承与Fragment
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
}
说明:
- FragmentLayoutTest通过
setContentView(R.layout.fragment_layout_test)
来调用fragment_layout_test.xml来作为布局文件。
-
上面的fragment_layout_test.xml布局文件仅仅值包括1个Fragment,该Fragment是通过FragmentLayoutTest的内部类ExampleFragment实现的
-
内部类ExampleFragment继承于Fragment,在onCreateView()方法中通过
return inflater.inflate(R.layout.example_fragment, container, false)
来将example_fragment.xml作为其布局文件。
所以,相当于FragmentLayoutTest直接调用example_fragment.xml来显示。
方法2
该Fragment采用动态加载的方式。
FragmentTransactionTest
package com.skywang.app;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
public class FragmentTransactionTest extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fragment_transaction_test);
// 获取FragmentManager
FragmentManager fragmentManager = getFragmentManager();
// 获取FragmentTransaction
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
// 获取ExampleFragment
ExampleFragment fragment = new ExampleFragment();
// 将fragment添加到容器about_fragment_container中
fragmentTransaction.add(R.id.about_fragment_container, fragment);
fragmentTransaction.commit();
}
// 继承与Fragment
public static class ExampleFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
}
说明:
-
在onCreate()中该activit调用fragment_transaction_test作为其布局文件
-
在onCreate()中,通过获取FragmentManager和FragmentTransaction,来将ExampleFragment对象添加到R.id.about_fragment_container中,about_fragment_container是一个Fragment。
-
ExampleFragment的onCreateView()中,将example_fragment作为其布局文件。
fragment_transaction_test.xml
<FrameLayout
android:id="@+id/about_fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
example_fragment.xml
<TextView
android:text="Hello Fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>