天天看點

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_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);

 public void onCreate(Bundle 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時,回調該方法

 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中被删除時回調該方法

 public void onDetach() {

  super.onDetach();

  // 将mCallbacks賦為null。

  mCallbacks = null;

 // 當使用者點選某清單項時激發該回調方法

 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);

源碼

繼續閱讀