本节介绍一个ListFragment的例子,MainActivity左边显示一个ListFragment,右边是一个FrameLayout容器,该FrameLayout容器将会动态更新其中的Fragment
MainActivity布局文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- 定义一个水平排列的LinearLayout,并指定使用中等分隔条 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
android:showDividers="middle" >
<!-- 添加一个Fragment -->
<fragment
android:id="@+id/fragment_list_main"
android:name="com.example.activity.MyListFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- 添加一个FrameLayout容器 -->
<FrameLayout
android:id="@+id/framelayout_content_main"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
</LinearLayout>
<!-- 定义一个水平排列的LinearLayout,并指定使用中等分隔条 -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
android:showDividers="middle" >
<!-- 添加一个Fragment -->
<fragment
android:id="@+id/fragment_list_main"
android:name="com.example.activity.MyListFragment"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<!-- 添加一个FrameLayout容器 -->
<FrameLayout
android:id="@+id/framelayout_content_main"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2" />
</LinearLayout>
MainActivity.java类
public class MainActivity extends Activity implements MyListFragment.Callbacks {
ContentFragment是具体的Fragment类,代码会上传上去
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
// 实现Callbacks接口必须实现的方法
public void onItemSelected(Integer id) {
// 创建Bundle,准备向Fragment传入参数
Bundle arguments = new Bundle();
arguments.putInt("id", id);
// 创建ContentFragment对象
ContentFragment fragment = new ContentFragment();
// 向Fragment传入参数
fragment.setArguments(arguments);
// 使用fragment替换framelayout_content_main容器当前显示的Fragment
getFragmentManager().beginTransaction()
.replace(R.id.framelayout_content_main, fragment).commit();
}
}
开发ListFragment的子类无需重写onCreatView()方法,类似ListActivity,只要调用ListFragment的setAdapter()方法为其设置Adapter即可。
MyListFragment.java类
public class MyListFragment extends ListFragment {
private Callbacks mCallbacks;
// 定义一个回调接口,该Fragment所在Activity需要实现该接口
// 该Fragment将通过该接口与它所在的Activity交互
public interface Callbacks {
public void onItemSelected(Integer id);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 为该ListFragment设置Adapter
ArrayAdapter adapter = new ArrayAdapter(getActivity(),
android.R.layout.simple_list_item_1, new String[] {
"DialogFragment", "ListFragment", "WebViewFragment",
"PreferenceFragment" });
setListAdapter(adapter);
}
// 当该Fragment被添加、显示到Activity时,回调该方法
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// 如果Activity没有实现Callbacks接口,抛出异常
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException(
"MyListFragment所在的Activity必须实现Callbacks接口!");
}
// 把该Activity当成Callbacks对象
mCallbacks = (Callbacks) activity;
}
// 当该Fragment从它所属的Activity中被删除时回调该方法
@Override
public void onDetach() {
super.onDetach();
// 将mCallbacks赋为null。
mCallbacks = null;
}
// 当用户点击某列表项时激发该回调方法
@Override
public void onListItemClick(ListView listView, View view, int position,
long id) {
super.onListItemClick(listView, view, position, id);
// 激发mCallbacks的onItemSelected方法
mCallbacks.onItemSelected(position);
}
public void setActivateOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(
activateOnItemClick ? ListView.CHOICE_MODE_SINGLE
: ListView.CHOICE_MODE_NONE);
}