tabhost studio example android android-fragments android-tabhost android-fragmentactivity

android - studio - TabHost con fragmentos y FragmentActivity



tabhost android studio (1)

Sugeriría crear un archivo de fragmento separado para cada pestaña. Recientemente también hice esto, así que he descrito mi código a continuación:

Archivos de diseño

activity_main.xml

<android.support.v4.app.FragmentTabHost xmlns:android="http://schemas.android.com/apk/res/android" android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TabWidget android:id="@android:id/tabs" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="0"/> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0"/> <FrameLayout android:id="@+id/realtabcontent" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> </LinearLayout> </android.support.v4.app.FragmentTabHost>

tab1_view.xml // agregue sus respectivos diseños de pestañas usando este formato (asegúrese de cambiar las variables de cadena)

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".DeviceFragment" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/tab1_fragment_string" /> </LinearLayout>

Archivos SRC

MainActivity.java // note que en el proceso .addTab solo usé texto. También puede agregar íconos usando los elementos extraíbles que deberá agregar a su carpeta hdpi. También solo creé tres pestañas en este ejemplo.

package com.example.applicationname; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTabHost; public class MainActivity extends FragmentActivity { // Fragment TabHost as mTabHost private FragmentTabHost mTabHost; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTabHost = (FragmentTabHost)findViewById(android.R.id.tabhost); mTabHost.setup(this, getSupportFragmentManager(), R.id.realtabcontent); mTabHost.addTab(mTabHost.newTabSpec("tab1").setIndicator("Tab1"), Tab1Fragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("tab2").setIndicator("Tab2"), Tab2Fragment.class, null); mTabHost.addTab(mTabHost.newTabSpec("tab3").setIndicator("Tab3"), Tab3Fragment.class, null); } }

Tab1Fragment.java // una vez más se replica para el número deseado de pestañas

package com.example.applicationname; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Tab1Fragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View V = inflater.inflate(R.layout.tab1_view, container, false); return V; } }

Asegúrese de que sus archivos R.java y strings.xml estén configurados correctamente y, luego, sus pestañas deben estar en funcionamiento.

Estoy trabajando en una aplicación para Android y quiero usar 3 pestañas para navegar usando Fragmentos para cada pestaña, pero no sé cómo crear la estructura para hacerlo.

Quiero agregar cada fragmento por separado porque cada uno es diferente, pero no sé dónde agregarlos en FragmentActivity.

Tengo estos archivos.

tabs_layout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="match_parent" android:layout_width="match_parent"> <TabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="match_parent"> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" > <TabWidget android:id="@android:id/tabs" android:layout_width="match_parent" android:layout_height="wrap_content" /> <FrameLayout android:id="@android:id/tabcontent" android:layout_width="match_parent" android:layout_height="match_parent" > <FrameLayout android:id="@+id/tabRateAPet" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/tabViewMyRates" android:layout_width="match_parent" android:layout_height="match_parent" /> <FrameLayout android:id="@+id/tabViewGlobalRates" android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout> </LinearLayout> </TabHost> </LinearLayout>

TabsMain.java

import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; public class MainTabsActivity extends FragmentActivity { public static final String RATE_A_PET = "Rate a Pet"; public static final String MY_RATES = "My Rates"; public static final String GLOBAL_RATES = "Global Rates"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tabs_layout); } }

Tabs.java

import android.app.Activity; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TabHost; import android.widget.TabHost.OnTabChangeListener; import android.widget.TabHost.TabSpec; import android.widget.TextView; public class Tabs extends Fragment implements OnTabChangeListener { private static final String TAG = "FragmentTabs"; public static final String RATE_A_PET = "Rate a Pet"; public static final String MY_RATES = "My Rates"; public static final String GLOBAL_RATES = "Global Rates"; private View mRoot; private TabHost mTabHost; private int mCurrentTab; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // super.onCreateView(inflater, container, savedInstanceState); mRoot = inflater.inflate(R.layout.tabs_layout, null); mTabHost = (TabHost) mRoot.findViewById(android.R.id.tabhost); setupTabs(); return mRoot; } private void setupTabs() { mTabHost.setup(); // important! mTabHost.addTab(newTab(RATE_A_PET, R.string.tabRateAPet, R.id.tabRateAPet)); mTabHost.addTab(newTab(MY_RATES, R.string.tabViewMyRates, R.id.tabViewMyRates)); } private TabSpec newTab(String tag, int labelId, int tabContentId) { Log.d(TAG, "buildTab(): tag=" + tag); View indicator = LayoutInflater.from(getActivity()).inflate( R.layout.tab, (ViewGroup) mRoot.findViewById(android.R.id.tabs), false); ((TextView) indicator.findViewById(R.id.text)).setText(labelId); TabSpec tabSpec = mTabHost.newTabSpec(tag); tabSpec.setIndicator(indicator); tabSpec.setContent(tabContentId); return tabSpec; } @Override public void onTabChanged(String tabId) { Log.d(TAG, "onTabChanged(): tabId=" + tabId); if (RATE_A_PET.equals(tabId)) { updateTab(tabId, R.id.tabRateAPet); mCurrentTab = 0; return; } if (MY_RATES.equals(tabId)) { updateTab(tabId, R.id.tabViewMyRates); mCurrentTab = 1; return; } if (GLOBAL_RATES.equals(tabId)) { updateTab(tabId, R.id.tabViewGlobalRates); mCurrentTab = 2; return; } } private void updateTab(String tabId, int placeholder) { FragmentManager fm = getFragmentManager(); if (fm.findFragmentByTag(tabId) == null) { fm.beginTransaction() .replace(placeholder, new RateMyPetActivity(), tabId) .commit(); } } }