{"id":1905,"date":"2020-03-17T14:04:08","date_gmt":"2020-03-17T20:04:08","guid":{"rendered":"https:\/\/naps.com.mx\/blog\/?p=1905"},"modified":"2020-03-24T12:17:21","modified_gmt":"2020-03-24T18:17:21","slug":"tabs-y-toolbars-en-android","status":"publish","type":"post","link":"https:\/\/naps.com.mx\/blog\/tabs-y-toolbars-en-android\/","title":{"rendered":"Tabs y toolbars en Android"},"content":{"rendered":"<p>Vamos a realizar una aplicaci\u00f3n que nos permita observar la forma en que se crean los tabs y toolbars en android.<\/p>\n<p><!--more--><\/p>\n<p>El resultado final lo puedes ver aqu\u00ed:\u00a0<a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/gif-tabs-y-toolbars-en-android.gif\" target=\"_blank\" rel=\"noopener\">Tabs y toolbars en Android: Resultado final<\/a><\/p>\n<p>Comencemos:<\/p>\n<p>Crea un nuevo proyecto.<\/p>\n<h2>Agregar las dependencias<\/h2>\n<p>Abre el archivo build.gradle (Module:app)<\/p>\n<p>A\u00f1ada a la secci\u00f3n de dependencies las siguientes dos:<\/p>\n<p><span class=\"Apple-converted-space\">\u00a0<\/span><strong>implementation &#8216;com.android.support:support-v4:27.1.1&#8217;<\/strong><\/p>\n<p><strong><span class=\"Apple-converted-space\">\u00a0<\/span>implementation \u2018com.android.support:design:27.1.1&#8242;<\/strong><\/p>\n<p>Donde la versi\u00f3n coincida con su versi\u00f3n de compileSdkVersion que aparece en ese mismo archivo.<\/p>\n<p>Clic en <em><strong>Sync Now<\/strong><\/em> para descargar las dependencias.<\/p>\n<h2>Toolbars en Android<\/h2>\n<p>Abra su archivo styles.xml (res-&gt;layout-&gt;values-&gt;styles.xml)<\/p>\n<p>Verifique que la linea siguiente efectivamente apunte a NoActionBar<\/p>\n<p><strong>&lt;style name=\u00bbAppTheme\u00bb parent=\u00bbTheme.AppCompat.Light.NoActionBar\u00bb&gt;<\/strong><\/p>\n<p>Con esto indicamos que quite el actionbar, y lo hacemosporque<span class=\"Apple-converted-space\">\u00a0 <\/span>vamos a implementar nuestro propio toolbar.<\/p>\n<h2>Crear un toolbar<\/h2>\n<p>En la carpeta de res-&gt;Layout Agregue un nuevo Layout Resource File con el nombre <em><strong>toolbar.<\/strong><\/em><\/p>\n<p>El c\u00f3digo de \u00e9ste archivo lo puedes ver a continuaci\u00f3n:<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;?xml version=\"1.0\" encoding=\"utf-8\"?&gt;\r\n&lt;android.support.v7.widget.Toolbar\r\n    xmlns:android=\"http:\/\/schemas.android.com\/apk\/res\/android\"\r\n    xmlns:app=\"http:\/\/schemas.android.com\/apk\/res-auto\"\r\n\r\n\r\n    android:id=\"@+id\/toolbar\"\r\n    android:layout_width=\"match_parent\"\r\n    android:layout_height=\"?attr\/actionBarSize\"\r\n    android:background=\"?attr\/colorPrimary\"\r\n    android:elevation=\"4dp\"\r\n    android:theme=\"@style\/ThemeOverlay.AppCompat.Dark.ActionBar\"\r\n    app:popupTheme=\"@style\/ThemeOverlay.AppCompat.Light\"\r\n\r\n    \/&gt;<\/pre>\n<p>En el <em><strong>activity_main.xml<\/strong><\/em> haga referencia a ese archivo<\/p>\n<p><strong>&lt;include<\/strong><\/p>\n<p><strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>android:id=\u00bb@+id\/toolbar\u00bb<\/strong><\/p>\n<p><strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>layout=\u00bb@layout\/toolbar\u00bb<\/strong><\/p>\n<p><strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>\/&gt;<\/strong><\/p>\n<p>Eso ir\u00eda dentro del constraint layout, antes del textview que en este momento dice Hello World<\/p>\n<p>Vamos a MainActivity e implementamos el toolbar.<\/p>\n<p>Podemos crear una funci\u00f3n que nos haga esa labor:<\/p>\n<pre class=\"lang:java decode:true \">private void setToolBar(){\r\n        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);\r\n        setSupportActionBar(toolbar);\r\n        \/\/getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_home);\r\n        getSupportActionBar().setDisplayHomeAsUpEnabled(true);\r\n    }<\/pre>\n<p>Y desde onCreate la mandamos a llamar:<\/p>\n<p><strong>setToolBar();<\/strong><\/p>\n<p>Nuestra app se ver\u00eda as\u00ed:<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-11.57.57.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1914\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-11.57.57.png\" alt=\"Tabs y toolbars en Android\" width=\"538\" height=\"916\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-11.57.57.png 538w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-11.57.57-176x300.png 176w\" sizes=\"auto, (max-width: 538px) 100vw, 538px\" \/><\/a><\/p>\n<h2>Creaci\u00f3n de \u00a0los fragments que mostrar\u00e1n el contenido de cada Tab<\/h2>\n<p>Cree un nuevo <em><strong>Package<\/strong><\/em> con el nombre Fragments (este paso es opcional)<\/p>\n<p>Cree tres fragments: de clic secundario sobre el package Fragments y New-&gt;Fragment-&gt;Fragment Blank como se ve en la siguiente imagen.<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.07.14.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1909\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.07.14.png\" alt=\"Tabs y toolbars en Android\" width=\"1594\" height=\"1324\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.07.14.png 1594w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.07.14-300x249.png 300w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.07.14-768x638.png 768w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.07.14-1024x851.png 1024w\" sizes=\"auto, (max-width: 1594px) 100vw, 1594px\" \/><\/a><\/p>\n<p>Los nombre de los fragments que usaremos ser\u00e1n: EstadosFragment, ChatsFragment, y LlamadasFragment.<\/p>\n<p>Vaya a EstadosFragment.java y notar\u00e1 la siguiente l\u00ednea:<\/p>\n<p><strong>return inflater.inflate(R.layout.fragment_estados, container, false);<\/strong><\/p>\n<p>Modif\u00edquela para que quede de la siguiente forma:<\/p>\n<p><span class=\"Apple-converted-space\">\u00a0<\/span><strong>View view = inflater.inflate(R.layout.fragment_estados, container, false);<\/strong><\/p>\n<p><strong><span class=\"Apple-converted-space\">\u00a0 \u00a0 \u00a0 \u00a0 <\/span>return view;<\/strong><\/p>\n<p>Y haga lo mismo para los tres fragments<\/p>\n<p>Vaya a <em><strong>fragment_estados.xml<\/strong><\/em> y vamos a modificar el texto por default que contiene:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;TextView\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"match_parent\"\r\n        android:textSize=\"90dp\"\r\n        android:text=\"estados\" \/&gt;<\/pre>\n<p>Haga algo similar para los siguientes dos fragments,<\/p>\n<h2>Creaci\u00f3n de los tabs<\/h2>\n<p>En el activity_main.xml agregariamos el c\u00f3digo del tablayout. Tambi\u00e9n agregaremos un ViewPager para hacer el efecto de desplazamiento entre los tabs. \u00c9ste c\u00f3digo lo puedes insertar debajo del toolbar.<\/p>\n<pre class=\"lang:xhtml decode:true \">&lt;android.support.design.widget.TabLayout\r\n        android:id=\"@+id\/tabLayout\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"wrap_content\"\r\n        android:layout_marginEnd=\"0dp\"\r\n        android:layout_marginStart=\"0dp\"\r\n        android:layout_marginTop=\"0dp\"\r\n        android:background=\"?attr\/colorPrimary\"\r\n        android:elevation=\"4dp\"\r\n        android:minHeight=\"?attr\/actionBarSize\"\r\n        android:theme=\"@style\/ThemeOverlay.AppCompat.Dark.ActionBar\"\r\n        app:layout_constraintEnd_toEndOf=\"parent\"\r\n        app:layout_constraintStart_toStartOf=\"parent\"\r\n        app:layout_constraintTop_toBottomOf=\"@+id\/toolbar\" \/&gt;\r\n\r\n\r\n\r\n&lt;android.support.v4.view.ViewPager\r\n        android:id=\"@+id\/viewPager\"\r\n        android:layout_width=\"match_parent\"\r\n        android:layout_height=\"459dp\"\r\n        app:layout_constraintTop_toBottomOf=\"@id\/tabLayout\"\r\n\r\n        \/&gt;\r\n<\/pre>\n<h2>Implementar el TabLayout<\/h2>\n<pre class=\"lang:java decode:true \"> TabLayout tabLayout = (TabLayout) findViewById(R.id.tabLayout);\r\n        tabLayout.addTab(tabLayout.newTab().setText(\"Estados\"));\r\n        tabLayout.addTab(tabLayout.newTab().setText(\"Chats\"));\r\n        tabLayout.addTab(tabLayout.newTab().setText(\"Llamadas\"));\r\n        tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);\r\n<\/pre>\n<p>En \u00e9ste momento nuestra app se ver\u00eda as\u00ed:<\/p>\n<p><a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.39.23.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1911\" src=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.39.23.png\" alt=\"Tabs y Toolbars en Android\" width=\"502\" height=\"894\" srcset=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.39.23.png 502w, https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/Captura-de-Pantalla-2020-03-17-a-las-12.39.23-168x300.png 168w\" sizes=\"auto, (max-width: 502px) 100vw, 502px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p>Crear el adaptador<\/p>\n<p>Para mostrar el contenido de los fragments en cada pesta\u00f1a de los tabs necesitamos un Adaptador. Cree una nueva Clase de Java y n\u00f3mbrela PagerAdapter (o el nombre que desee proporcionarle).<\/p>\n<p>El c\u00f3digo completo de \u00e9sta clase es el siguiente:<\/p>\n<pre class=\"lang:java decode:true \">public class PagerAdapter extends FragmentStatePagerAdapter {\r\n\r\n    private int numberOfTabs;\r\n\r\n\r\n    public PagerAdapter(FragmentManager fm, int numberOfTabs) {\r\n        super(fm);\r\n        this.numberOfTabs = numberOfTabs;\r\n    }\r\n\r\n    @Override\r\n    public int getCount() {\r\n        return numberOfTabs;\r\n    }\r\n\r\n    @Override\r\n    public Fragment getItem(int position) {\r\n        switch (position){\r\n            case 0:\r\n                return  new EstadosFragment();\r\n            case 1:\r\n                return  new ChatFragment();\r\n            case 2:\r\n                return  new LlamadasFragment();\r\n            default:\r\n                return null;\r\n        }\r\n\r\n    }\r\n}\r\n<\/pre>\n<p>Ahora debemos implementar \u00e9ste adaptador.<\/p>\n<p>Vamos a mainactivity.java<\/p>\n<p>En onCreate agregamos:<\/p>\n<pre class=\"lang:java decode:true \">PagerAdapter adapter = new PagerAdapter(getSupportFragmentManager(),\r\n                tabLayout.getTabCount());\r\n\r\n        final ViewPager viewPager =  findViewById(R.id.viewPager);\r\n        viewPager.setAdapter(adapter);\r\n        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));\r\n\r\n\r\n        tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {\r\n            @Override\r\n            public void onTabSelected(TabLayout.Tab tab) {\r\n                int position = tab.getPosition();\r\n                viewPager.setCurrentItem(position);\r\n            }\r\n\r\n            @Override\r\n            public void onTabUnselected(TabLayout.Tab tab) {\r\n\r\n            }\r\n\r\n            @Override\r\n            public void onTabReselected(TabLayout.Tab tab) {\r\n\r\n            }\r\n        });\r\n    }<\/pre>\n<p>Listo. Podemos observar el comportamiento de nuestra aplicaci\u00f3n, donde al cambiar entre pesta\u00f1as vemos el contenido de cada fragment. Podemos modificar \u00e9ste contenido a lo que deseemos.<\/p>\n<p>Puedes ver el resultado final aqui:\u00a0<a href=\"https:\/\/naps.com.mx\/blog\/wp-content\/uploads\/2020\/03\/gif-tabs-y-toolbars-en-android.gif\" target=\"_blank\" rel=\"noopener\">Tabs y toolbars en Android: Resultado final<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vamos a realizar una aplicaci\u00f3n que nos permita observar la forma en que se crean los tabs y toolbars en android.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"amp_status":"","footnotes":""},"categories":[234],"tags":[235,263,264],"class_list":["post-1905","post","type-post","status-publish","format-standard","hentry","category-aplicaciones-moviles","tag-desarrollo-de-aplicaciones-moviles","tag-tabs-en-android","tag-toolbars-en-android"],"_links":{"self":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/comments?post=1905"}],"version-history":[{"count":7,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1905\/revisions"}],"predecessor-version":[{"id":1947,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/posts\/1905\/revisions\/1947"}],"wp:attachment":[{"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/media?parent=1905"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/categories?post=1905"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/naps.com.mx\/blog\/wp-json\/wp\/v2\/tags?post=1905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}