问题:
由于真实状态不足,平台使用折叠导航(即 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");
}
}
变通方案:
通过反射我们可以得到tab spinner对象并调用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