Используйте вкладку с новым ToolBar (AppCompat v7-21) - программирование

Используйте вкладку с новым ToolBar (AppCompat v7-21)

Я использовал SupportActionBar с вкладками и пользовательской темой ActionBar (созданной с помощью http://jgilfelt.github.io/android-actionbarstylegenerator/), которые показывают вкладки только тогда, когда пользователь расширяет поиск.

public boolean onMenuItemActionExpand(MenuItem item) {
        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        return true;
    }
}

Я перешел из ActionBar в панель инструментов. Мое приложение действительно нуждается в поддержке API 9.

Есть ли способ использовать этот код для добавления вкладок назад?:

Toolbar toolbar = (Toolbar) findViewById(R.id.new_actionbar);
setSupportActionBar(toolbar);
getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

Если возможно, как я могу использовать свою собственную тему или стиль панели инструментов?

В документации говорится, что это устарело и предлагает использовать другой тип навигации. Но я не знаю никаких других компонентов в Android, которые имеют одинаковую функциональность.

Некоторая помощь?

4b9b3361

Ответ 1

В API 21 метод setNavigationMode(ActionBar.NAVIGATION_MODE_TABS) устарел.

Вы можете использовать другой шаблон. Например, вы можете использовать тот же пример, который вы можете увидеть в googleio14.

Он использует SlidingTabLayout, который работает с ViewPager.

Здесь вы можете найти пример (это в вашем примере sdk)

Здесь вы можете найти пример Google io14:

ОБНОВЛЕНИЕ 29/05/2015

В новой Библиотеке поддержки дизайна теперь вы можете использовать новый TabLayout.

Просто добавьте эту зависимость в свой build.gradle

compile 'com.android.support:design:22.2.0'

Код очень прост:

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(viewPager);

Чтобы реализовать многие особенности материальных конструкций, вы должны использовать их в CoordinatorLayout и AppBarLayout.

Что-то вроде этого:

 <android.support.design.widget.CoordinatorLayout
         xmlns:android="http://schemas.android.com/apk/res/android"
         xmlns:app="http://schemas.android.com/apk/res-auto"
         android:layout_width="match_parent"
         android:layout_height="match_parent">


     <android.support.design.widget.AppBarLayout
             android:layout_height="wrap_content"
             android:layout_width="match_parent">

         <android.support.v7.widget.Toolbar
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

         <android.support.design.widget.TabLayout
                 ...
                 app:layout_scrollFlags="scroll|enterAlways"/>

     </android.support.design.widget.AppBarLayout>

     <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        app:layout_behavior="@string/appbar_scrolling_view_behavior" />

 </android.support.design.widget.CoordinatorLayout>

Ответ 2

Хотя, возможно, немного поздно ответить на этот вопрос сейчас, я понял, что написал ответ по аналогичному вопросу, который охватывает как использование библиотеки поддержки дизайна, так и до Google I/O.

Я включил основные части ниже:


Использование TabLayout с Toolbar стало намного проще, поскольку анонс библиотеки поддержки дизайна Android означает, что нам больше не нужно загружать пользовательские классы просмотра.

От Опубликовать блог разработчиков Android Developers в Библиотеке поддержки дизайна Android:

Вкладки:

Переключение между различными видами в приложении через tabs не является новой концепцией материального дизайна, и они одинаково дома как верхний навигационный шаблон или для организации различных группировок контента в вашем приложении (скажем, разных жанров музыки).

Библиотеки дизайна TabLayout реализуют обе фиксированные вкладки, где ширина представлений делится поровну между всеми вкладками, а также прокручиваемые вкладки, где вкладки не имеют одинакового размера и могут прокручиваться по горизонтали. Вкладки можно добавлять программно:

TabLayout tabLayout = ...;
tabLayout.addTab(tabLayout.newTab().setText("Tab 1"));

Однако, если вы используете ViewPager для горизонтального подкачки между вкладками, вы можете создавать вкладки непосредственно из PagerAdapter s getPageTitle(), а затем соедините их вместе, используя setupWithViewPager(). Это гарантирует, что события выбора табуляции обновят ViewPager и изменения страницы обновят выбранную вкладку.


Если вы не используете библиотеку поддержки дизайна, вам нужно будет сделать следующее:

1. Загрузите SlidingTabLayout.java и SlidingTabStrip.java из приложения конференции Google I/O на GitHub. Это будут представления, которые будут использоваться в макете вкладок, поэтому я создал папку с другими моими действиями Java под названием "view" и разместил их там.

2. Отредактируйте макет, чтобы включить SlidingTabLayout:

<LinearLayout
    android:orientation="vertical"
    ... >

    <!-- This is the Toolbar with the tabs underneath -->
    <LinearLayout
        android:orientation="vertical"
        ... >

        <include android:id="@+id/my_toolbar" layout="@layout/toolbar" />

        <com.mycompany.myapp.SlidingTabLayout
            android:id="@+id/sliding_tabs"
            android:background="?attr/colorPrimary"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <!-- This is the ViewPager (which you already should have if you have
        used tabs before) -->
    <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    ...

</LinearLayout>

Линия, которая ссылается на Toolbar (<include android:id="@+id/detail_toolbar" layout="@layout/toolbar" />), ссылается на другой файл XML, который я использовал для создания Toolbar.

3. Измените имена пакетов в SlidingTabLayout.java и SlidingTabStrip.java, соответствующие месту их размещения. В моем случае я использовал что-то похожее на: package com.mycompany.myapp.view; для обоих этих файлов. Организуйте импорт и добавьте все необходимое, как указано в IDE, которую вы используете.

4. В Activity (который расширялся AppCompatActivity) установите Toolbar в методе onCreate:

Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
setSupportActionBar(toolbar);

5. Настройте части ViewPager и SlidingTabLayout:

mViewPager = (ViewPager) findViewById(R.id.view_pager);
mViewPager.setAdapter(new ViewPagerAdapter(getSupportFragmentManager()));
mSlidingTabLayout = (SlidingTabLayout) findViewById(R.id.sliding_tabs);
mSlidingTabLayout.setSelectedIndicatorColors(getResources().getColor(R.color.tab_line));   
mSlidingTabLayout.setDistributeEvenly(true);
mSlidingTabLayout.setViewPager(mViewPager);

Цвет "tab_line" был цветом, который я обозначил в color.xml, который будет цветом индикатора строки вкладок. Также обратите внимание, что перечисленные выше переменные были глобальными, которые я определил ранее в этом действии:

SlidingTabLayout mSlidingTabLayout;
ViewPager mViewPager;

6. Наконец, настройте ViewPagerAdapter, который я назвал ранее. Это будет зависеть от изменения страницы в зависимости от выбранной вкладки. Я использовал следующий код:

public class ViewPagerAdapter extends FragmentPagerAdapter {

    public ViewPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        // Returns the number of tabs
        return 3;
    }

    @Override
    public Fragment getItem(int position) {
        // Returns a new instance of the fragment
        switch (position) {
            case 0:
                return new FragmentOne();
            case 1:
                return new FragmentTwo();
            case 2:
                return new FragmentThree();
        }
        return null;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        Locale l = Locale.getDefault();
        switch (position) {
            case 0:
                return getString(R.string.title_section1).toUpperCase(l);
            case 1:
                return getString(R.string.title_section2).toUpperCase(l);
            case 2:
                return getString(R.string.title_section3).toUpperCase(l);
        }
        return null;
    }
}

Как я уже упоминал выше, дальнейшие подробности этих решений доступны на другом вопросе, на который я ответил, об использовании скользящих вкладок с панелью инструментов.