2012-06-25 37 views
4

的問題片段導航裏面一個標籤式操作欄

在我描述我的當前設置,我將描述我的問題。我需要在單獨的選項卡內的片段之間進行分層導航。假設我在一個標籤中向下鑽取,然後切換選項卡,然後返回到第一個原始選項卡,我需要將它放在鑽孔級別上,然後有能力返回到最高級別標籤。

現在進入我的設置。

我有一個應用程序,名爲MainActivity。該活動控制了我的選項卡式操作欄。我選擇了一個選項卡後,我遵循許多不同的教程來處理片段切換,下面的代碼提示您注意onTabSelectedonTabUnselected方法。

MainActivity - 選項卡監聽器

public static class MyTabListener<T extends Fragment> implements ActionBar.TabListener { 
    private final Activity mActivity; 
    private final String mTag; 
    private final Class<T> mClass; 
    private final Bundle mArgs; 
    private Fragment mFragment; 

    public MyTabListener(Activity activity, String tag, Class<T> clz) { 
     this(activity, tag, clz, null); 
    } 

    public MyTabListener(Activity activity, String tag, Class<T> clz, Bundle args) { 
     mActivity = activity; 
     mTag = tag; 
     mClass = clz; 
     mArgs = args; 

     // Check to see if we already have a fragment for this tab, probably 
     // from a previously saved state. If so, deactivate it, because our 
     // initial state is that a tab isn't shown. 
     mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag); 
     if (mFragment != null && !mFragment.isDetached()) { 
      FragmentTransaction ft = mActivity.getFragmentManager().beginTransaction(); 
      ft.detach(mFragment); 
      ft.commit(); 
     } 
    } 

    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     Log.e("FRAGMENT","Selected Fragment With Tag " + mTag); 
     if (mFragment == null) { 
      mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs); 
      ft.add(android.R.id.content, mFragment, mTag); 
     } else { 
      ft.attach(mFragment); 
     } 
    } 

    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
     if (mFragment != null) { 
      ft.detach(mFragment); 
     } 
    } 

    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
     Toast.makeText(mActivity, "Reselected!", Toast.LENGTH_SHORT).show(); 
    } 


} 

當我在觀看Tab1片段Fragment1', when a button is pressed I then show anothercalled Fragment2`,我需要從回去的能力。下面的代碼工作,如果我只是留在該標籤,但是當從標籤導航離開並返回到它時,一切都搞砸了。

MainActivity - 顯示第二個片段

Fragment tdFrag = Fragment.instantiate(this, SecondFragment.class.getName()); 
    FragmentTransaction ft = getFragmentManager().beginTransaction(); 
    ft.replace(android.R.id.content, tdFrag, "secondfrag"); 
    ft.addToBackStack(null); 
    ft.commit(); 

我的思想

我想,那一定是我卸下片段和處理的方式,當按下一個新的標籤頁切換。也許我需要實現某種方式來爲每個選項卡存儲每個單獨的後臺堆棧並從中加載碎片而不是系統後端堆棧?

任何幫助將是偉大的。我試圖儘可能徹底和簡單地解釋它。

在此先感謝。

回答

1

好了,經過一番實驗後,我決定使用枚舉類型實現一個自定義的backstack。

我有兩種類型的枚舉類型:a ViewTypeCurrentTab類型。 CurrentTab類型告訴我當前正在查看哪個標籤,ViewType告訴我在這些標籤中正在查看哪個視圖。我有一個ViewType的實例,用於存儲我處於層次結構中的每個選項卡。

爲了實現一個backstack,我重寫了按下後退按鈕時調用的方法。

public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK) { 

      return true; 
     } 
    return super.onKeyDone(keyCode,event); 
} 

因此,在檢查後退按鈕的位置,我把我的代碼檢查當前選項卡和單獨的視圖類型。這樣我就知道我在哪裏,如果我推回去,我知道我需要去哪裏。

我希望這可以幫助任何問題只是發表評論。

+1

你可以使用Activity.onBackPressed()方法 – ffleandro