Fragment的介绍
Fragment可以当成Activity的一个界面的一个组成部分,甚至Activity的界面可以完全有不同的Fragment组成,更帅气的是Fragment拥有自己的生命周期和接收、处理用户的事件,这样就不必在Activity写一堆控件的事件处理的代码了,并且占用内存降低,性能大幅度提高。更为重要的是,你可以动态的添加、替换和移除某个Fragment。
Fragment的生命周期
- onAttach()当该Fragment被添加到Activity时被回调。该方法只会被调用一次。
- onCreate()创建Fragment时被回调。该方法只会被回调一次
- onCreateView()每次创建、绘制该Fragment的View组件时回调该方法,Fragment会显示该方法返回的View对象
- onActivityCreated() 当Fragment所在的Activity被启动完成后回调该方法。当Activity的onCreate()方法返回之后调用该方法。
- onStart()启动Fragment时被回调
- onResume()恢复Fragment时回调该方法,在onStart()方法后一定会回调该方法。
- onPause() 暂停Fragment时回调该方法
- onStop() 停止Fragment时被回调
- onDestroyView() 销毁该Fragment所包含的View组件时调用
- onDestroy() 销毁Fragment时被回调
- onDetach() 将该Fragment从Activity中删除、替换完成时回调该方法,在onDestroy()方法后一定会回调onDetach()方法。该方法只会被回调一次。
Fragment的使用
1.静态使用
首先创建两个XML文件,fragment1.xml和fragment2.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="碎片1"
android:textColor="#000000"
android:textSize="25sp" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff00" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="碎片2"
android:textColor="#000000"
android:textSize="25sp" />
</LinearLayout>
然后创建两个两个类,Fragment1和Fragment2分别继承Fragment,注意,使用的V4包中的Fragment!
public class Fragment1 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment1, container, false);
}
}
public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment2, container, false);
}
}
最后在activity_main.xml里面使用两个fragment
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment
android:id="@+id/fragment1"
android:name="yin.layout.Fragment1"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<fragment
android:id="@+id/fragment2"
android:name="yin.layout.Fragment2"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
</LinearLayout>
2.动态使用
首先在activity_main.xml里面的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_show_fragment1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示Fragment1"/>
<Button
android:id="@+id/btn_show_fragment2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示Fragment2"/>
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
然后还是创建2个fragment,可以使用快速创建
最后是在MainActivity里使用代码进行动态添加
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnLoadFrag1 = (Button)findViewById(R.id.btn_show_fragment1);
btnLoadFrag1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
transaction.add(R.id.fragment_container, fragment1);
transaction.commit();
}
});
Button btnLoagFrag2 = (Button)findViewById(R.id.btn_show_fragment2);
btnLoagFrag2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment2 fragment2 = new Fragment2();
transaction.add(R.id.fragment_container, fragment2);
transaction.commit();
}
});
}
}
其实动态添加最主要的就是这几个步奏(注意! transaction不要复用!!!)
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
Fragment1 fragment1 = new Fragment1();
transaction.add(R.id.fragment_container, fragment); //添加
transaction.show(R.id.fragment_container, fragment); //显示
transaction.hide(R.id.fragment_container, fragment); //隐藏
transaction.replace(R.id.fragment_container, fragment); //替换
transaction.remove(R.id.fragment_container, fragment); //移除
transaction.commit();
Fragment的传参
敬请期待