根据官方文档:
Fragment表现Activity中用户界面的一个行为或者是一部分。你可以在一个单独的activity上把多个fragment组合成为一个多区域的UI,并且可以在多个activity中再使用。你可以认为fragment是activity的一个模块零件,它有自己的生命周期,接收它自己的输入事件,并且可以在activity运行时添加或者删除。
所以我们可以通过Fragment来构建我们UI的不同区域,并且不同的Fragment可以加以复用。Activity中也可以动态地管理自己的Fragment。下面创建一个Demo,用来实现根据点击不同的按钮来对不同的Fragment进行切换。
我们需要创建3个Fragment,用来根据按钮切换不同的布局。创建Fragment的方法非常简单,我们需要定义一个静态的布局文件,然后创建一个Fragment的导出类,并重写其中的onCreateView方法。注意Fragment在3.0版本后才推出,所以在创建项目时应选择API11为最低版本。
这里只演示一个Fragment的布局文件和对应类的实现
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:text="BTN2 Fragment" android:gravity="center" android:textSize="40dp"/> </LinearLayout>
package com.example.wayne_t.fragmentdemo; import android.app.Fragment; import android.os.Bundle; import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; /** * Created by Wayne-T on 2015/6/10. */ public class Btn2Fragment extends Fragment { @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.btn2_layout, container, false); } }
然后是我们目标Activity的布局文件,在其中需要添加3个按钮,然后设置一个FrameLayout去用来切换3个Fragment
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn1" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1" android:text="Btn1"/> <Button android:id="@+id/btn2" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1" android:text="Btn2"/> <Button android:id="@+id/btn3" android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_weight="1" android:text="Btn3"/> </LinearLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/content"> </FrameLayout> </LinearLayout>
对应的Activity中需要设置事件去监听按钮,在onCreate中我们设置默认的Fragment,然后在监听事件中设置Fragment切换的操作。这里使用的是FragmentTransaction的replace方法完成对Fragment的切换。
注意切换时需要实例化对应的Fragment的导出类,否则直接抛出异常。
package com.example.wayne_t.fragmentdemo; import android.app.Activity; import android.app.FragmentManager; import android.app.FragmentTransaction; import android.os.Bundle; import android.view.View; import android.widget.Button; /** * Created by Wayne-T on 2015/6/10. */ public class SecondDemo extends Activity implements View.OnClickListener { private ContentFragment cf; private Btn2Fragment b2f; private Btn3Fragment b3f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btn1 = (Button) findViewById(R.id.btn1); Button btn2 = (Button) findViewById(R.id.btn2); Button btn3 = (Button) findViewById(R.id.btn3); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); // 默认fragment FragmentManager fmanager = getFragmentManager(); FragmentTransaction ftransaction = fmanager.beginTransaction(); cf = new ContentFragment(); ftransaction.replace(R.id.content, cf); ftransaction.commit(); } @Override public void onClick(View v) { FragmentManager manager = getFragmentManager(); FragmentTransaction ft = manager.beginTransaction(); switch(v.getId()) { case R.id.btn1: if(cf == null) cf = new ContentFragment(); ft.replace(R.id.content, cf); break; case R.id.btn2: if(b2f == null) b2f = new Btn2Fragment(); ft.replace(R.id.content, b2f); break; case R.id.btn3: if(b3f == null) b3f = new Btn3Fragment(); ft.replace(R.id.content, b3f); break; default: break; } ft.commit(); } }ContentFragment,Btn2Fragment,Btn3Fragment都是Fragment的导出类。
已经创建的Fragment也可以直接在Activity的布局文件中使用,方法如下:
<fragment android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/title_fragment" android:name="com.example.wayne_t.fragmentdemo.TitleFragment" tools:layout="@layout/title_layout" /> <fragment android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/content_layout" android:name="com.example.wayne_t.fragmentdemo.ContentFragment" tools:layout="@layout/content_layout" />
效果图: