Android - TabWidget的程序化滚动

时间:2011-05-25 21:32:40

标签: android tabs scroll tabwidget

我在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);
    }

3 个答案:

答案 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);
}