2013-02-07 53 views
1

我想製作一個android佈局,其中包含菜單條目的屏幕左側有一個ListFragment,然後是ListFragment右側的區域,我可以通過編程在不同的片段中加載基於在左邊選擇的條目。所以我開始製作一個包含兩個框架佈局的水平線性佈局的xml佈局文件。我的想法是,我可以將我的碎片加載到框架佈局中。在Android上動態添加ListFragment

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="0dp" 
    android:layout_height="match_parent"> 

    <FrameLayout 
     android:id="@+id/fragment_container_left" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="30"/> 


    <FrameLayout 
     android:id="@+id/fragment_container_right" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_weight="70"/> 

</LinearLayout> 

然後在onCreate方法我MainViewActivity I類添加一個列表片段向左容器,和列表片段向右容器。

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.menu_items); 

    if(findViewById(R.id.fragment_container_left) != null) { 
     if(savedInstanceState == null){ 
      MenuListFragment menuListFragment = new MenuListFragment(); 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.add(R.id.fragment_container_left, menuListFragment); 
      ft.commit(); 
     } 
    } 

    if(findViewById(R.id.fragment_container_right) != null) { 
     if(savedInstanceState == null){ 
      MoveListFragment moveListFragment = new MoveListFragment(); 
      FragmentManager fm = getFragmentManager(); 
      FragmentTransaction ft = fm.beginTransaction(); 
      ft.add(R.id.fragment_container_right, moveListFragment); 
      ft.commit(); 
     } 
    } 
} 

所以那麼MenuListFragment的onCreate方法是:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setListAdapter(ArrayAdapter.createFromResource(getActivity().getApplicationContext(), 
      R.array.menu_items, R.layout.main_menu_item)); 
} 

然後是MoveListFragment的onCreate方法是:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    String[] items = { "move 1", "move 2", "move 3", "move 4" }; 
    setListAdapter(new ArrayAdapter<String>(getActivity(), R.layout.move_list_items, items)); 
} 

這裏是main_menu_item XML:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="24sp" 
    android:padding="6dp" 
    android:id="@+id/main_menu_item"/> 

和move_list_items XML:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:textSize="24sp" 
    android:padding="6dp" 
    android:id="@+id/move_list_item"/> 

當我運行這段代碼,我沒有得到任何形式的錯誤,但只是一個白色背景顯示在屏幕上。我不明白我做錯了什麼。

回答

4

調用findViewById(R.id.fragment_container_left)會給你FrameLayout,而不是片段,它顯然永遠不會爲空。您應該檢查各分段是否已經存在使用findFragmentById

if(getFragmentManager().findFragmentById(R.id.fragment_container_left) == null) { 
     MenuListFragment menuListFragment = new MenuListFragment(); 
     FragmentManager fm = getFragmentManager(); 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(R.id.fragment_container_left, menuListFragment); 
     ft.commit(); 
} 

至於另一頭,你可以對列表中的片段使用setTargetFragment列表片段鏈接內容片段。如果片段被重新創建,這將自動重新連接片段。