前言:
Fragment的设计哲学
Android在3.0中引入了Fragment的概念,主要目的是用在大屏幕设备上,例如平板电脑,支持更加动态和灵活的UI设计;平板电脑的屏幕要比手机的大得多,有更多的UI组件,并且这些组件会产生更多的交互.
Fragment在你的应用中应当是一个模块化和可重用的组件,因为Fragment定义了它自己的布局,以及通过使用它自己的生命周期回调函数定义了它自己的行为,你可以将Fragment添加到多个Activity中.
知识概要:
1> Fragment乐意作为Activity界面的一部分组成出现;
2> 一个Activity钟可以同时出现多个Fragment,并且一个Fragment也可以添加到多个Activity中去使用;
3> 在Activity运行的过程中,可以添加,移除或者替换Fragment;
4> Fragment可以响应自己的输入事件,并且有自己的生命周期,他们的生命周期会受到宿主Activity生命周期的影响.
Fragment的使用
1> fragment本身和activity很相似
2> fragment 本身存在生命周期 创建一个fragment继承自系统的Fragment
然后在OnCreateView方法中从布局文件中加载View
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//在资源文件中加载视图 返回一个视图给我们
View view = inflater.inflate(R.layout.hello,container,false);
return view;
}
3> 最后将fragment加到 activity中,就能显示出来 fragment的加载方式通常会有两种:
< 一 > 静态加载
在Activity的layout文件中声明Fragment,需要特别注意的是中的android:name属性指定了在layout中实例化的Fragment类;静态加载Fragment 在Activity中必须要为fragment设置一个id唯一标识,否则会报错。
Activity的XML文件中静态加载Fragment:
<?xml version="1.0" encoding="utf-8"?>
<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:orientation="vertical"
android:background="#FFED1E07">
<fragment
android:id="@+id/fragment" <指明唯一标识>
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:name="com.example.zxjk.fragment_01.MyFragment"/>
</LinearLayout>
< 二 > 动态加载
通过撰写代码将Fragment添加到一个Activity的Layout中.
动态加载Fragment在Android中称为处理Fragment事务;根据用户的交互情况对fragment进行添加,移除,替换以及执行其他动作,提交给Activity的每一套动作变化被称作一个事务;提交时,必须调用commit()方法.
public class Main2Activity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
MyFragment myFragment = new MyFragment();
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.linear,myFragment); < 添加fragment >
transaction.commit();
}
}
4> 通过使用FragmentManager向activity中添加fragment FragmentManger不能使用V4的包 否则会报错.
注释:
**在activity中首先从layout中加载view设置成activity的内容视图
setContentView(R.layout.activity_main);
设置完activity的内容视图之后,可以通过事先指定的id拿到指定的控件
button = (Button)findViewById(R.id.button);**
< Fragment的生命周期 >
onAttach(Activity activity)
onCreate()
< Fragment 与 Activity的通信 >
1> Fragment可调用getActivity()方法获取它所在的Activity;
2> Activity可调用FragmentManager的findFragmentByID() 或者findFragmentByTag()方法 获取Fragment;
3> Activity—>>Fragment 在Activity中创建Bundle数据包,并调用Fragment的setArguments(Bundle bundle)方法;
/** activity 传递数据给 fragment */
Bundle bundle = new Bundle();
bundle.putString("name","决定到手");
myFragment.setArguments(bundle);
FragmentManager manager = getFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.linear,myFragment);
transaction.commit();
String string = getArguments().get("name")+""; // 接收到 activity传递过来的数据
4> Fragment –>>Activity 需要在Fragment中定义一个内部回调接口,再让包含该Fragment的Activity实现该回调接口,这样Fragment可调用该回调方法将数据传递给Activity.
5> 当一个Activity中需要加载多个Fragment时,其中涉及到方法的执行顺序:
现在activity需要加载显示4个不同的fragment
08-16 10:26:32.761 19913-19913/com.example.zxjk.lydemo_android_02 I/activity>>: onStart
08-16 10:26:32.761 19913-19913/com.example.zxjk.lydemo_android_02 I/activity>>: onResume
08-16 10:26:32.791 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onAttach
08-16 10:26:32.791 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onCreate
08-16 10:26:32.791 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onCreateView
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onStart
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_01>>: onResume
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onAttach
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onCreate
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onCreateView
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onAttach
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onCreate
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onCreateView
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onAttach
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onCreate
08-16 10:26:32.811 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onCreateView
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onStart
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_02>>: onResume
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onStart
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_03>>: onResume
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onStart
08-16 10:26:32.821 19913-19913/com.example.zxjk.lydemo_android_02 I/Fragment_04>>: onResume
我们可以看到 第一个fragment的所有方法一次性全部执行了,而后面的三个fragment依次创建,到最后才显示在activity上面。
setUserVisibleHint 网易新闻客户端 实现页面可见可加载,不可见不加载,节省用户流量.