Fragment初学4——使用Fragment的子类ListFragment

本节介绍一个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>

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);
 }
上一篇:Fragment初学2——使用Fragment


下一篇:const char*和char**参数怎么传?