Usar pestaña con nueva barra de herramientas (AppCompat v7-21)


Estaba usando SupportActionBar con pestañas y un tema ActionBar personalizado (creado con http://jgilfelt.github.io/android-actionbarstylegenerator / ), que muestran las pestañas solo cuando el usuario expande la vista de búsqueda.

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

Migré de ActionBar a Toolbar. Mi aplicación realmente necesita soportar API 9.

¿Hay alguna manera de usar este código para agregar las pestañas de nuevo?:

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

Si es posible, ¿cómo puedo usar mi tema personalizado o estilo de la barra de herramientas?

La documentación dice que esto está obsoleto y sugiere usar un tipo diferente de navegación. Pero no conozco ningún otro componente en Android que tenga la misma funcionalidad.

¿Alguna ayuda?

Author: Epicality, 2014-10-24

2 answers

Con la API 21 el método setNavigationMode(ActionBar.NAVIGATION_MODE_TABS) es obsoleto.

Puedes usar un patrón diferente. Por ejemplo, puedes usar el mismo ejemplo que puedes ver en googleio14.

Utiliza un SlidingTabLayout que funciona con un ViewPager.

Aquí puede encontrar el ejemplo (está en su ejemplo de sdk)

Aquí puedes encontrar el ejemplo de Google io14:

ACTUALIZAR 29/05/2015

Con la nueva Biblioteca de Soporte de diseño ahora puede usar la nueva TabLayout .

Simplemente agregue esta dependencia a su build.gradle

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

El código es muy simple:

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

Para implementar muchas de las características de los diseños de materiales, debe usarlo dentro de un CoordinatorLayout y a AppBarLayout.

Algo como esto:

 <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>
 155
Author: Gabriele Mariotti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-23 02:41:33

Aunque probablemente sea un poco tarde para responder a esta pregunta ahora, me di cuenta de que escribí una respuesta a una pregunta similar que cubre tanto el uso de la Biblioteca de Soporte de Diseño como antes de Google I/O.

He incluido las partes esenciales a continuación:


Usar un TabLayout con el Toolbar se ha vuelto mucho más simple desde el anuncio de la Biblioteca de Soporte de Diseño de Android , lo que significa que ya no necesitamos descargar clases de vista personalizadas.

De la Publicación de Blogspot de desarrolladores de Android en la Biblioteca de Soporte de Diseño de Android :

Tabs :

Cambiar entre diferentes vistas en su aplicación a través de pestañas no es un concepto nuevo para material design y están igualmente en casa como un patrón de navegación de nivel superior o para organizar diferentes agrupaciones de contenido dentro de su aplicación (por ejemplo, diferentes géneros de música).

La biblioteca de diseño TabLayout implementa ambas pestañas fijas, donde el ancho de la vista se divide por igual entre todas las pestañas, así como pestañas desplazables, donde las pestañas no tienen un tamaño uniforme y pueden desplazarse horizontalmente. Las pestañas se pueden agregar mediante programación:

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

Sin embargo, si está utilizando un ViewPager para la paginación horizontal entre pestañas, puede crear pestañas directamente desde su PagerAdapter's getPageTitle() y luego conectar dos juntos usando setupWithViewPager(). Esto garantiza que los eventos de selección de pestañas actualicen el ViewPager y los cambios de página actualicen la pestaña seleccionada.


Si no está utilizando la biblioteca de soporte de diseño, tendrá que hacer lo siguiente:

1. Descargar el SlidingTabLayout.java y SlidingTabStrip.java archivos de la aplicación de Conferencia de E/S de Google en GitHub. Estas serían las vistas que se usarían en el diseño de pestañas, así que creé una carpeta con mis otras actividades Java llamado 'view' y los colocó allí.

2. Edita tu diseño para incluir el 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>

La línea que hace referencia a la Toolbar (<include android:id="@+id/detail_toolbar" layout="@layout/toolbar" />), está haciendo referencia a otro archivo XML que había utilizado para hacer el Toolbar.

3. Cambie los nombres de los paquetes en SlidingTabLayout.java y SlidingTabStrip.java correspondientes al lugar donde se colocaron. En mi caso, usé algo similar a: package com.mycompany.myapp.view; para ambos archivos. Organizar las importaciones y añadir las necesarias, como ha señalado el IDE estás consumiendo.

4. En su Activity (que se extendía AppCompatActivity), configure el Toolbar en el método onCreate:

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

5. Configura las partes ViewPager y 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);

El color 'tab_line' era un color que había declarado en color.xml que sería el color del indicador de línea de tabulación. También tenga en cuenta que las variables anteriores eran globales que definí anteriormente en esta actividad:

SlidingTabLayout mSlidingTabLayout;
ViewPager mViewPager;

6. Finalmente, configure el ViewPagerAdapter que Había llamado antes. Esto sería responsable de cambiar la página dependiendo de la pestaña seleccionada. Usé el siguiente código:

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

Como mencioné anteriormente, más detalles de estas soluciones están disponibles en otra pregunta que respondí, sobre el uso de pestañas deslizantes con la Barra de herramientas.

 14
Author: Farbod Salamat-Zadeh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:25:51