一.Fragment概述:
在Fragment出现后,布局就更好的适应了各种大小尺寸的android手机,而且更加方便的实现不同页面的切换,就不像以前activity的跳转那样的麻烦了。可以在activity中嵌套不同的Fragment,每个Fragment可以用不同的布局,可以动态的进行添加、替换,就像下面的图片一样:
二. Fragment的生命周期:
每个Fragment都有自己生命周期,但是与activity的生命周期不全相同,Fragment额外的添加了5个生命周期回调方法。先看一下图:
这五个方法:
1.onAttach(Activity); //当Activity与Fragment发生关联时调用。
2.onCreateView(LayoutInflater,ViewGroup,Bundle); //创建该Fragment的视图
3.onActivityCreate(bundle); //当Activity的onCreate();方法返回时调用
4.onDestoryView(); //与onCreateView相对应,当改Fragment被移除时调用
5.onDetach(); //与onAttach()相对应,当Fragment与Activity的关联被取消时调用
注意:除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现。
继承Fragment必须重写这个方法:
(2).onCreateView():
fragment第一次绘制它的用户界面的时候, 系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view就是你在fragment中实现的布局,不提供则返回null。
生命周期:
(1)第一次启动Fragment:
onAttach
onCreate
onCreateView
onActivityCreated
onStart
onResume
(2)切换到其他Fragment:
onPause
onStop
onDestroyView
(3)切换回来:
onCreateView
onActivityCreated
onStart
onResume
(4)返回手机桌面:
onPause
onStop
回到应用
onStart
onResume
(5)退出应用
onPause
onStop
onDestroyView
onDestroy
onDetach
三.动态的使用Fragment:
Fragment经常作为activity的界面的一部分,既然是一部分那么Fragment肯定会给activity用一个layout,也可以说是一个view,那么就要通过onCreateView返回activity一个layout,那么怎么返回呢?就要重写这个方法:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return super.onCreateView(inflater, container, savedInstanceState); }
这里的三个参数第一个inflater不用说是用来获得布局文件的,第二个参数container就是将要插入的父ViewGroup,第三个提供恢复Fragment提供数据用的。
重写就要这样实现:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_1, container, false); }
这样就可以把Fragment布局返回了。
四.实现开始的效果图:
主界面:
public class MainActivity extends Activity implements OnClickListener { RelativeLayout r1; RelativeLayout r2; RelativeLayout r3; RelativeLayout view = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.bottom_layout); r1 = (RelativeLayout) findViewById(R.id.layout1); r2 = (RelativeLayout) findViewById(R.id.layout2); r3 = (RelativeLayout) findViewById(R.id.layout3); r1.setOnClickListener(this); r2.setOnClickListener(this); r3.setOnClickListener(this); setDefaultFragment(); } private void setDefaultFragment() { FragmentManager fm = getFragmentManager(); FragmentTransaction transaction = fm.beginTransaction(); MyFragment my = new MyFragment(); transaction.replace(R.id.frame_layout1, my); transaction.commit(); } @Override public void onClick(View arg0) { FragmentManager fm = getFragmentManager(); // 开启Fragment事务 FragmentTransaction transaction = fm.beginTransaction(); switch (arg0.getId()) { case R.id.layout1: if (view != null) { view.setBackgroundResource(R.color.back_bg); } view = r1; r1.setBackgroundResource(R.color.black_purple); MyFragment my = new MyFragment(); transaction.replace(R.id.frame_layout1, my); transaction.commit(); break; case R.id.layout2: if (view != null) { view.setBackgroundResource(R.color.back_bg); } view = r2; r2.setBackgroundResource(R.color.black_purple); MyFragment2 my2 = new MyFragment2(); transaction.replace(R.id.frame_layout1, my2); transaction.commit(); break; case R.id.layout3: if (view != null) { view.setBackgroundResource(R.color.back_bg); } view = r3; r3.setBackgroundResource(R.color.black_purple); MyFragment3 my3 = new MyFragment3(); transaction.replace(R.id.frame_layout1, my3); transaction.commit(); break; } } }
主界面布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:id="@+id/linear_layout" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_alignParentBottom="true" android:background="#696969" android:orientation="horizontal" > <RelativeLayout android:id="@+id/layout1" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/tab_bg" > <ImageView android:id="@+id/image1" android:layout_width="28dp" android:layout_height="28dp" android:layout_centerHorizontal="true" android:layout_marginTop="5dp" android:background="@drawable/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/image1" android:layout_centerHorizontal="true" android:text="音乐" android:textSize="13sp" > </TextView> </RelativeLayout> <RelativeLayout android:id="@+id/layout2" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/tab_bg" > <ImageView android:id="@+id/image2" android:layout_width="28dp" android:layout_height="28dp" android:layout_centerHorizontal="true" android:layout_marginTop="5dp" android:background="@drawable/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/image2" android:layout_centerHorizontal="true" android:text="电影" android:textSize="13sp" > </TextView> </RelativeLayout> <RelativeLayout android:id="@+id/layout3" android:layout_width="0dp" android:layout_height="fill_parent" android:layout_weight="1" android:background="@drawable/tab_bg" > <ImageView android:id="@+id/image3" android:layout_width="28dp" android:layout_height="28dp" android:layout_centerHorizontal="true" android:layout_marginTop="5dp" android:background="@drawable/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/image3" android:layout_centerHorizontal="true" android:text="影视" android:textSize="13sp" > </TextView> </RelativeLayout> </LinearLayout> <FrameLayout android:id="@+id/frame_layout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@id/linear_layout" > </FrameLayout> </RelativeLayout>
Fragment实现:
public class MyFragment extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment_1, container, false); } }
Fragment布局:
<?xml version="1.0" encoding="utf-8"?> <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_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="第一个页面" /> </RelativeLayout>
另外两个Fragment和这个相同。