2012-10-01 117 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

太棒了!享受好友。 –

相关问题