4

我嘗試安裝在我的應用程序以下導航:裏面ViewPager片段替換ListFragment與標籤

實際情況:ViewPager +選項卡列表之間刷卡:

  • ListFragment一個
  • ListFragment乙

期望的條件: ViewPager +標籤:

  • ListFragment甲onListItemSelected替換ListFragment A和DetailFragment甲
  • ListFragment乙onListItemSelected與DetailFragment乙

的目標是顯示標籤導航內部的細節片段替換ListFragment乙。我無法用detailFragment替換fragmentList(fragmentList沒有自定義佈局,因此也沒有ID,我不知道該怎麼做)。 此外,開始一個新的活動隱藏標籤欄。

有人可以幫我嗎?

回答

14

我會做一個包裝片段,知道要顯示什麼 - 列表或細節。這將與ViewPager完全分離 - 尋呼機只知道它持有包裝碎片,並且這些將自己管理它們的內容。

實施將沿着這些路線:

public class WrapperFragment extends Fragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MyListFragment list = new MyListFragment(); 
     list.setListAdapter(adapter); 
     list.setOnItemClickListener(new OnItemClickListener() { 
      @Override public void onItemClick(AdapterView<?> l, View v, int position, long id) { 
       // Create details fragment based on clicked item's position 
       Fragment details = new Fragment(); 
       getChildFragmentManager() 
        .beginTransaction() 
        .replace(R.id.container, details) 
        .addToBackStack(null) 
        .commit(); 
      } 
     }); 

     getChildFragmentManager() 
      .beginTransaction() 
      .add(R.id.container, list) 
      .commit(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     // There has to be a view with id `container` inside `wrapper.xml` 
     return inflater.inflate(R.layout.wrapper, container, false); 
    } 

    public class MyListFragment extends ListFragment { 

     private OnItemClickListener listener; 

     public void setOnItemClickListener(OnItemClickListener l) { 
      this.listener = l; 
     } 

     @Override 
     public void onListItemClick(ListView l, View v, int position, long id) { 
      if(listener != null) { 
       listener.onItemClick(l, v, position, id); 
      } 
     } 
    } 
} 

wrapper.xml。想法是,WrapperFragment必須提供一個佈局,其中包含一個編號爲container的視圖 - 因爲我們正在使用該編號來查看子片段 - MyListFragmentDetailsFragment

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

    <FrameLayout 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</FrameLayout> 

的另一種方式。這應該工作,但你必須要嘗試了這一點(佈局有id本身,而不是用ID container孩子):

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"/> 
+0

請問佈局包裝這個樣子?我得到了onCreateView的InflateException。 2013-03-10 12:22:22

+1

添加了'wrapper.xml'的示例。讓我知道如果你有這個問題 – mindeh 2013-03-10 12:48:52

+0

謝謝,它似乎工作正常。 – 2013-03-10 14:36:50