> Fragment翻译过来是碎片、片段的意思。我们可以将Fragment填充到Activity中,这样提高了界面的美观度和用户的体验,另外也提高了效率。该怎么使用呢?下面通过一个简单的例子说明。
【1】创建一个工程Fragment,在activity_main布局文件中,我们添加几个button控件和一个帧布局,最终如下所示:
<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"
tools:context=".MainActivity" >
<FrameLayout
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" >
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="showCaiJing"
android:text="财经" />
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="showYuLe"
android:text="娱乐" />
<Button
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:onClick="showTiYu"
android:text="体育" />
</LinearLayout>
</LinearLayout>
然后分别创建三个Fragment:CaiJingFragment、YuLeFragment、TiYuFragment.
- CaiJingFragment:
public class CaiJingFragment extends Fragment {
// 返回当前fragment的内容
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.caijing, null);
}
}
创建与CaiJingFragment对应的布局文件,并添加一个TextView空间显示其内容。
<?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:background="#55ff0000"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="我是财经页面的内容"/>
</LinearLayout>
- YuLeFragment:
public class YuLeFragment extends Fragment {
// 返回当前fragment的内容
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.yule, null);
}
}
创建与YuLeFragment对应的布局文件,并添加一个TextView空间显示其内容。
<?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:background="#5500ff00"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="我是娱乐页面的内容"/>
</LinearLayout>
- TiYuFragment:
public class TiYuFragment extends Fragment {
// 返回当前fragment的内容
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.tiyu, null);
}
}
创建与
TiYuFragment
对应的布局文件,并添加一个TextView空间显示其内容。
<?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:background="#550000ff"
android:orientation="vertical" >
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="我是体育页面的内容"/>
</LinearLayout>
- MainActivity中的代码如下:
package com.beijing.fragment;
import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showCaiJing(View view) {
CaiJingFragment fragment = new CaiJingFragment();
FragmentManager fm = getFragmentManager();
// 事务
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, fragment);
ft.commit();
}
public void showYuLe(View view) {
YuLeFragment fragment = new YuLeFragment();
FragmentManager fm = getFragmentManager();
// 事务
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, fragment);
ft.commit();
}
public void showTiYu(View view) {
TiYuFragment fragment = new TiYuFragment();
FragmentManager fm = getFragmentManager();
// 事务
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.container, fragment);
ft.commit();
}
}
最终显示效果如图:
【2】我们发现MainActivity中代码重复度很大,为了简便,对之修改,将FragmentManager与FragmentTransaction提为全局变量,再在onCreate()方法里添加CaiJingFragment的显示内容,这样在onCreate()方法里就已经初始化了两个变量,所以将几个Fragment里FragmentManager与FragmentTransaction的内容删除,运行发现出错,异常为:
java.lang.IllegalStateException: Could not execute method of the activity
这个问题是由于在onCreate()方法里,事务提交后已经结束,所以在几个Button点击的方法里必须重新开启事务方可避免这个问题。在showCaiJing、showYuLe、showTiYu几个方法中添加:
<span style="white-space:pre"> </span>// 开启事务
ft = fm.beginTransaction();
运行就不再出现问题。
【3】Activity与Fragment如何通信呢?我们在原来代码的基础上进行演示。现在activity_main中添加一个EditText控件(这个控件是在Activity中的):
<EditText
android:id="@+id/et_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="请输入一个姓名,我在Activity里面" />
然后我们为了能在CaiJingFragment里能获取到MainActivity的
EditText内容,在caijing.xml中添加一个Button,当我们在EditText中输入内容,在CaiJingFragment中点击Button时将内容用一个Toast显示出来。caijing.xml中添加的Button:
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
在CaiJingFragment中实现逻辑部分。在Fragment中要获得依赖的Activity,可以通过getActivity()方法获得。最后
CaiJingFragment的代码如下:
public class CaiJingFragment extends Fragment {
private Button button;
// 返回当前fragment的内容
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.caijing, null);
button = (Button) view.findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
EditText et_name = (EditText) getActivity().findViewById(
R.id.et_name);
Toast.makeText(getActivity(),
"name:" + et_name.getText().toString(), 1).show();
}
});
return view;
}
}
运行结果:
> 本文的代码链接http://download.csdn.net/detail/programmerteny/9471216,可下载研究