Как программно переключать вкладки с помощью нажатия кнопки в Android - PullRequest
21 голосов
/ 24 декабря 2010

Я боролся с этим уже несколько дней.Я пытаюсь переключать вкладки программно по нажатию кнопки.Моя программа работает безупречно, если я просто использую вкладки для изменения действий, но соединение метода onClick с setCurrentTab приводит к ошибке.Это метод, который не будет работать.Это довольно простая и простая функция, но я не видел много документации или примеров людей, пытающихся связать кнопку нажатием кнопки с переключением вкладок.Спасибо.

ImageButton next = (ImageButton) findViewById(R.id.ButtonAsk);
 next.setOnClickListener(new View.OnClickListener() 
         {         
  public void onClick(View view)  
             {

                TabHost tabHost =  (TabHost) findViewById(android.R.id.tabhost);
              tabHost.setCurrentTab(2);                
             }
         });

Смотрите историю изменений в журнале ошибок.

Ответы [ 4 ]

26 голосов
/ 22 ноября 2012

Вот пример кода, который вы можете поместить в свой onClick (). Это как описали Марк и Кевин.

    TabActivity tabs = (TabActivity) getParent();
    tabs.getTabHost().setCurrentTab(2);

Я использовал этот код Tidbit много раз. Надеюсь, что это проясняет.

17 голосов
/ 24 декабря 2010

Нет виджета с @android:id/tabhost в текущей активности.Следовательно, findViewById() возвращает ноль, и ваш вызов на setCurrentTab() завершается неудачей.

Теперь, я думаю, это потому, что вы помещаете действия в свои вкладки.Если бы вы поместили Views в свои вкладки, ваш код работал бы.Ваш код также был бы быстрее, занимал бы меньше места в куче и имел бы меньший риск исчерпания пространства стека.

Если вы хотите придерживаться своей текущей реализации, попробуйте вызвать getParent().findViewById() вместо простого findViewById().

8 голосов
/ 05 декабря 2016

2017 ответ

Другие ответы здесь устарели. Документация Создание видов с использованием вкладок рекомендует использовать TabLayout с ViewPager.

Вот одна частичная реализация кода для этого.

public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;
    private Button mButton;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        // ...

        mViewPager = (ViewPager) findViewById(R.id.fieldspager);

        // ...

        mButton.setOnClickListener(myButtonClickHandler);
    }


    View.OnClickListener myButtonClickHandler = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mViewPager.setCurrentItem(2, true);
        }
    };
}

Исходя из кода выше, программная настройка вкладки выполняется следующим образом:

mViewPager.setCurrentItem(2, true); // set it to the third tab

Вот еще одна реализация с более подробной информацией о том, как настраивается пейджер и расположение вкладок.

7 голосов
/ 06 ноября 2013

Это работает для меня

getActionBar().setSelectedNavigationItem(0);

Обновление: подключить мой код к коду вопроса, чтобы придать ему больше контекста ...

ImageButton next = (ImageButton) findViewById(R.id.ButtonAsk);
next.setOnClickListener(new View.OnClickListener()
{
    public void onClick(View view)
    {
        getActionBar().setSelectedNavigationItem(2);
    }
});
...