我在TabWidget
内嵌套HorizontalScrollView
。我正在以编程方式设置活动/当前选项卡(我没有问题)。我的问题是,TabWidget
没有滚动显示新的活动标签。
示例 - 我有9个标签,在任何给定时间只显示3个标签(因此请查看标签的3个页面)。我在标签1(第1页)上。我以编程方式将当前选项卡设置为选项卡8(第3页)。选项卡内容正确切换(即,我现在看到选项卡8的内容),但是,顶部的选项卡仍然显示选项卡1,2和3.如果我手动向右滚动,我将看到选项卡8 (正确突出显示)。我想自动滚动TabWidget
,以便显示当前活动的标签。
有什么想法吗?
编辑示例来源:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
String tag;
/* logic to populate tag from intent*/
/* reason for this is because I know the tag of the tab I need,
not the index num. of tab */
getTabHost().setCurrentTabByTag(tag);
int i = getTabHost().getCurrentTab();
getTabWidget().setCurrentTab(i);
getTabWidget().focusCurrentTab(i);
}
答案 0 :(得分:2)
设置为TabHost下一个OnTabChangeListener:
@Override
public void onTabChanged(final String tag) {
View tabView = tabHost.getCurrentTabView();
int scrollPos = tabView.getLeft() - (tabsHorizontalScrollView.getWidth() - tabView.getWidth()) / 2;
tabsHorizontalScrollView.smoothScrollTo(scrollPos, 0);
}
答案 1 :(得分:1)
事实证明,TabWidget
视图将focusableInTouchMode设置为false。根据View.java文档:
A view will not actually take focus if it is not focusable ({@link #isFocusable}
returns false), or if it is focusable and it is not focusable in touch mode
({@link #isFocusableInTouchMode}) while the device is in touch mode.
为了解决问题,我在TabWidget
个视图上进行了迭代,并将它们设置为可在触摸模式下进行聚焦:
for (int i = 0; i < count; i++) {
getTabWidget().getChildAt(i).setFocusableInTouchMode(true);
}
答案 2 :(得分:0)
您必须同时使用focusCurrentTab(int i)和setCurrentTab(int i)。 focusCurrentTab(i)将TabWidget的UI聚焦到第i个选项卡(您想要的),并且,正如您所知,setCurrentTab(i)将聚焦主视图中第i个选项卡的实际内容。
供参考:http://developer.android.com/reference/android/widget/TabWidget.html#focusCurrentTab(int)
编辑:
我的回答不正确。这是正确的(海报发现自己):
事实证明,TabWidget视图将focusableInTouchMode设置为false。根据View.java文档:
如果视图不可调焦,则视图实际上不会成为焦点({@link #isFocusable} 返回false),或者它是可聚焦的,并且在触摸模式下不可聚焦 ({@link #isFocusableInTouchMode})当设备处于触摸模式时。 为了解决这个问题,我迭代了TabWidget视图并将它们设置为可在触摸模式下聚焦:
for (int i = 0; i < count; i++) {
getTabWidget().getChildAt(i).setFocusableInTouchMode(true);
}