Android - Программная прокрутка TabWidget - PullRequest
2 голосов
/ 26 мая 2011

Я вложил 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 ]

2 голосов
/ 16 сентября 2014

установлен на 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 голос
/ 27 мая 2011

Оказывается, что для 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);
}
0 голосов
/ 26 мая 2011

Вы должны использовать focusCurrentTab (int i) и setCurrentTab (int i).focusCurrentTab (i) будет фокусировать пользовательский интерфейс TabWidget на i-й вкладке (что вы хотите), и, как вы уже знаете, setCurrentTab (i) будет фокусировать фактическое содержимое i-й вкладки в главном представлении.1002 * Для справки: 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);
}
...