Android Tabs – Con Fragments y ViewPager
09 Jan 2016Este código es para crear Tabs en Android, utilizando Fragments y ViewPager. Antes de empezar hay que configurar el build.gradle de Android Studio como se indica en la página de CodePath.
Primero de todo, creamos en el xml principal “activity_main.xml” el TabLayout que serán las pestañas y el ViewPager que nos servirá para mostrar otros layouts según cambiemos de pestaña.
<LinearLayout 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:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/colorPrimaryDark"
android:layout_weight="1"
android:orientation="vertical"
android:gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Instant"
android:id="@+id/textView"
android:textColor="#FFF"
android:textSize="90sp"
android:layout_gravity="center" />
</LinearLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="250dp">
<android.support.design.widget.TabLayout
android:id="@+id/sliding_tabs"
style="@style/StartTabLayout"
app:tabTextColor="@color/whiteTransparent"
app:tabSelectedTextColor="#FFF"
android:background="@color/colorPrimaryDark"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabIndicatorColor="@color/colorSand"
app:tabGravity="fill"
app:tabMode="fixed" />
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="0px"
android:layout_weight="1"
android:background="@color/colorWhite" />
</LinearLayout>
</LinearLayout>Después en la clase principal “MainActivity.java” referenciamos el TabLayout y el ViewPager.
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
// Obtiene el ViewPager y establece su PagerAdapter para que pueda mostrar los elementos
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new Tabs_Bar(this.getSupportFragmentManager()));
// Pasa el TabLayout al ViewPager
TabLayout tabLayout = (TabLayout) findViewById(R.id.sliding_tabs);
tabLayout.setupWithViewPager(viewPager);
}
}Ahora creamos el contenido de cada layout a mostrar con el ViewPager. Voy a poner uno de ejemplo, pero como haremos 2 pestañas este paso habrá que duplicarlo. Mi ejemplo será “tab_empezar.xml” y el código dentro de un LinearLayout es el siguiente:
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:orientation="vertical"
android:paddingLeft="30dp"
android:paddingRight="30dp">
<Button
android:id="@+id/btn_sesion"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_marginBottom="10dp"
android:background="@drawable/start_btn_main"
android:paddingBottom="19dp"
android:paddingTop="19dp"
android:text="@string/iniciar_sesion"
android:textAllCaps="false"
android:textSize="20sp" />
<Button
android:id="@+id/btn_resetPassword"
style="?android:attr/borderlessButtonStyle"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:background="@drawable/start_btn_grey"
android:paddingBottom="15dp"
android:paddingTop="15dp"
android:text="@string/recuperar_contrasena"
android:textAllCaps="false"
android:textColor="@android:color/white"
android:textSize="14sp" />
</LinearLayout>Y luego creamos “TabEmpezar.java”, heredando de fragment e implementando el evento OnClickListener. Como he dicho antes, esto también se haría dos veces, una vez por cada pestaña que creamos.
public class TabEmpezar extends Fragment implements View.OnClickListener {
private Button btn_sesion, btn_resetPassword;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.tab_empezar, container, false);
btn_sesion = (Button) view.findViewById(R.id.btn_sesion);
btn_resetPassword = (Button) view.findViewById(R.id.btn_resetPassword);
btn_sesion.setOnClickListener(this);
btn_resetPassword.setOnClickListener(this);
return view;
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn_sesion) {
Intent intent = new Intent(getActivity(), InvitacionSolicitar.class);
startActivity(intent);
} else if (v.getId() == R.id.btn_resetPassword) {
// Abrir otro Activity
}
}
}Nos queda el último paso, darle nombre a las pestañas y según la pestaña nos muestre un layout u otro. Herendando de FragmentPagerAdapter creamos “Tabs_Bar.java” completamos el paso que hicimos al principio en el MainActivity.java y escribimos esto:
public class Tabs_Bar extends FragmentPagerAdapter {
private String tabTitles[] = {"Invitación", "Empezar"};
public Tabs_Bar(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return tabTitles.length;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
TabInvitacion tab1 = new TabInvitacion();
return tab1;
case 1:
TabEmpezar tab2 = new TabEmpezar();
return tab2;
default:
return new Fragment();
}
}
@Override
public CharSequence getPageTitle(int position) {
// Genera el titulo basado en la posicion
return tabTitles[position];
}
}Ya está. Con esto terminaríamos, y quedaría de esta manera:
