2011-05-25 36 views
2

我有一個TabWidget嵌套在HorizontalScrollView內。我正在編程設置活動/當前選項卡(我沒有問題)。我的問題是,TabWidget不滾動顯示新的活動選項卡。Android - 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

你都必須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); 
} 
+0

@Vinay我有*一些*成功的(如10次中的1次)。由於它是如此的sparadic,它使我相信,也許有一個競爭條件/時間/異步問題。基本上在'TabHost'層面上,我打電話給setCurrentTabByTag(標籤),然後說我= getCurrentTab()。然後在'TabWidget'上,我調用setCurrentTab(i)和focusCurrentTab(i)。任何見解? – Gimbl 2011-05-26 15:42:19

+0

當它不起作用時究竟發生了什麼?它是否會將它設置爲一些與您想要的選項卡相距甚遠的選項卡?它有沒有一種模式,它混亂了?爲什麼不提供相關的代碼。這對我來說可能是最簡單的方法,以查看可能出現的問題。 – Vinay 2011-05-26 20:13:03

+0

@Vinay我編輯原始文章以包含代碼。我很抱歉,由於我之前很匆忙,因此我的意思不是更清楚我的意思。通過**一些**成功我的意思是有時水平滾動的標籤欄滾動到新的當前標籤,有時候,標籤不會移動以反映新選擇的標籤。 「framelayout」內容可以正確切換,當前標籤可以正確選擇/突出顯示,但是有時候'tabhost'會'滾動'顯示當前標籤,有時候它不會移動。 – Gimbl 2011-05-27 00:44:26

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); 
} 
+1

我在這個邏輯選項卡窗口小部件焦點工作正常後,在水平滾動視圖內添加了選項卡窗口小部件。但是當嘗試滾動選項卡窗口小部件時,請選擇如何避免此問題,請提出建議。 – anp8850 2014-02-07 10:46:17

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