Android在3.0版本引入了Fragment(碎片)功能,android 4.0 后平板手机混用.用途在一个Activity里切换界面,切换界面时只切换Fragment里面的内容.生命周期方法跟Activity一致,可以理解把其为就是一个Activity.低版本要想使用fragment 请导入v4包.在support-v4.jar包中有相关api.
一.定义第一个Fragment
1.首先定义一个res/layout/下定义一个布局fragment1.
xml文件,这个文件作为Fragment的显示内容
2.定义一个java类
Fragment1继承Fragment类,重写onCreateView方法.加载刚才新建的布局文件
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
//用布局文件填充成一个View对象,返回出去,那么就显示在Fragment上了
View v = inflater.inflate(R.layout.fragment01, null);
return v;
}
3.把该页面加入要main_layout.xml文件中去
<fragment
android:id="@+id/fragment1"
android:name="com.example.fragmentdemo.Fragment1"
android:layout_width="0dip"
android:layout_height="match_parent"
android:layout_weight="1" />
二.Fragment的生命周期
fragment切换时旧fragment对象会销毁(pause(),stop(),destroy()方法会被调用),新的fragment对象会被创建.fragment的生命周期跟activity绑定在一起。
fragment的生命周期跟activity很像,这里只列出一些不一样,如下:
- onAttach方法:Fragment和Activity建立关联的时候调用。
- onCreateView方法:为Fragment加载布局时调用。
- onActivityCreated方法:当Activity中的onCreate方法执行完后调用。
- onDestroyView方法:Fragment中的布局被移除时调用。
- onDetach方法:Fragment和Activity解除关联的时候调用。
三.动态加载Fragment,将Fragment显示至指定ViewGroup中
1.主页面布局文件如下:
<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"
tools:context=".MainActivity"
android:orientation="horizontal"
>
<FrameLayout
android:id="@+id/fl"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"
></FrameLayout>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fragment01"
android:onClick="click1"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fragment02"
android:onClick="click2"
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="fragment03"
android:onClick="click3"
/>
</LinearLayout>
</LinearLayout>
2.主页面代码如下,这里让动态替换帧布局里面的内容,注意主页面的类要继承FragmentActivity,不是继承Activity类.
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fg3 = new Fragment03();
//获取fragment管理器
FragmentManager fm = getSupportFragmentManager();
//打开事务
FragmentTransaction ft = fm.beginTransaction();
//把内容显示至帧布局
ft.replace(R.id.fl, fg3);
//提交
ft.commit();
}
public void click1(View v){
//把fragment01的界面显示至帧布局中
//创建fragment对象
Fragment01 fg1 = new Fragment01();
//获取fragment管理器
FragmentManager fm = getSupportFragmentManager();
//打开事务
FragmentTransaction ft = fm.beginTransaction();
//把内容显示至帧布局
ft.replace(R.id.fl, fg1);
//提交
ft.commit();
}
其他按钮类似,这里不再列出.
四 Fragment与主页面互操作
1.在fragment操作主activity控件,通过getActivity方法,获取到宿主activity,可以通过在宿主activity中定义一系列公开的方法操作主页面的activity.
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment01, null);
final EditText et = (EditText) v.findViewById(R.id.et);
Button bt = (Button) v.findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String text = et.getText().toString();
//把数据传递给activity
((MainActivity)getActivity()).setText(text);
}
});
return v;
}
2.主页面操作fragment,跟上面操作的步骤类似,可以在fragment中定义操作的fragment Ui的公开方法,在每次调用时,调用每个fragment中的方法.
public void click4(View v){
String text = et_main.getText().toString();
Fragment02 fg2 = new Fragment02();
//传递数据
fg2 .setText(text);
}