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

    } 
 
 
 

   }



源码