2012-10-01 163 views
6

我面臨有關選項卡滑動的一個問題。我的項目建立在Android 3.2上。我正在實施使用支持庫4.0(android-support-v4.jar)的標籤刷卡。實施的一切工作正常,但是當我將我的應用程序部署到ICS設備時,然後在縱向模式下,我在操作欄中爲選項卡選擇了一個微調器。在縱向模式下,即使內容正在更改,滑動完成後標籤選擇也不會更改,並且在橫向模式下一切工作正常。如何在操作欄選項卡中顯示選定片段

final ActionBar actionBar = getActionBar(); 
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
actionBar.setDisplayHomeAsUpEnabled(true); 
// Set up the ViewPager with the sections adapter. 
ViewPager mViewPager = (ViewPager) findViewById(R.id.pager); 

mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 

    @Override 
    public void onPageSelected(int position) { 
     actionBar.setSelectedNavigationItem(position); 
    } 

}); 

我試圖把斷點actionBar.setSelectedNavigationItem(position);在這條線上,甚至在縱向模式下它獲取調用但選擇沒有改變。

任何人都可以幫忙嗎?

編輯: 找到一個similar problem但看不出究竟它是如何解決,如何將它在我的代碼整合。

+0

我想這樣的作品我的樣品中:https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/TabPager不過,我會建議你考慮從動作欄選項卡切換到「PagerTabStrip」或ViewPagerIndicator的選項卡風格,以便在方向上使用一致的選項卡:https://github.com/commonsguy/cw-omnibus/tree/master/ViewPager/Indicator – CommonsWare

+0

感謝您的回覆,我會看到鏈接,我只需要使用標籤刷卡,但感謝您的建議。我會嘗試實現PagerTabStripe,看看這是否更好。 – Android

回答

16

問題: 由於實際狀態不足,平臺使用摺疊導航(即Spinner)。系統自動確定景觀的NAVIGATION_MODE_TABS & NAVIGATION_MODE_LIST縱向,將橫向的方向更改爲縱向更新UI,但由於某些原因,導航模式屬性未更新爲NAVIGATION_MODE_LIST,因此未調用mActionView.setDropdownSelectedPosition(position)。見ActionBarImpl的下面的代碼:setSelectedNavigationItem

public void setSelectedNavigationItem(int position) { 
    switch (mActionView.getNavigationMode()) { 
    case NAVIGATION_MODE_TABS: 
     selectTab(mTabs.get(position)); 
     break; 
    case NAVIGATION_MODE_LIST: 
     mActionView.setDropdownSelectedPosition(position); 
     break; 
    default: 
     throw new IllegalStateException(
       "setSelectedNavigationIndex not valid for current navigation mode"); 
    } 
} 

解決方法解決: 通過反思,我們可以得到標籤微調對象,並調用爲setSelection方法。

private Spinner getTabSpinner() 
{ 
    try 
    { 
     int id = getResources().getIdentifier("action_bar", "id", "android"); 
     View actionBarView = findViewById(id); 

     Class<?> actionBarViewClass = actionBarView.getClass(); 
     Field mTabScrollViewField = actionBarViewClass.getDeclaredField("mTabScrollView"); 
     mTabScrollViewField.setAccessible(true); 

     Object mTabScrollView = mTabScrollViewField.get(actionBarView); 
     if (mTabScrollView == null) { 
      return null; 
     } 

     Field mTabSpinnerField = mTabScrollView.getClass().getDeclaredField("mTabSpinner"); 
     mTabSpinnerField.setAccessible(true); 

     Object mTabSpinner = mTabSpinnerField.get(mTabScrollView); 
     if (mTabSpinner != null) 
     { 
      return (Spinner)mTabSpinner; 
     } 
    } 
    catch (Exception e) { 
     return null; 
    } 

    return null; 
} 

然後在onPageSelected事件中調用上面的方法。

 public void onPageSelected(int position) { 
      actionBar.setSelectedNavigationItem(position); 
      Spinner spinner = getTabSpinner(); 
      if (spinner != null) { 
       spinner.setSelection(position); 
      } 
     } 

提到這個帖子https://gist.github.com/2657485

+0

嘿,Wayofhope很多。我會通過你的例子,讓你知道進展。 – Android

+0

嘿,謝謝你的希望之路。它工作出色。解決了我5天的問題。再次感謝。 – Android

+0

太棒了!享受好友。 –

相關問題