28

Ich arbeite an einer Android App und ich möchte 3 Registerkarten für die Navigation mit Fragmente für jede Registerkarte verwenden, aber ich weiß nicht, wie Sie die Struktur dafür erstellen.TabHost mit Fragmenten und FragmentActivity

Ich möchte jedes Fragment einzeln hinzufügen, da jedes anders ist, aber ich weiß nicht, wo Sie sie in FragmentActivity hinzufügen.

Ich habe diese Dateien.

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

} 
+0

siehe dieses Tutorial und wenn Sie irgendeine Schwierigkeit finden.u kann mich fragen ... http: //manishkpr.webheavens.com/android-viewpager-example/ – TheFlash

+0

Sie können dies auch verweisen.http: // wptrafficanalyzer. in/blog/hinzufügen-navigation-tabs-containing-listview-zu-aktionsbalken-in-android/ – Shadow

Antwort

73

ich für jeden Reiter eine separate Fragment-Datei erstellen vorschlagen würde. Ich habe vor kurzem das so gut, so habe ich meinen Code unten beschrieben:

Layout-Dateien

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 // fügen Sie Ihre jeweiligen Registerlayouts in diesem Format (stellen Sie sicher, dass String-Variablen ändern)

<?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> 

SRC Dateien

MainActivity.java // beachten Sie, dass in der .addTab Prozess habe ich nur Text verwendet. Sie können auch Symbole hinzufügen, indem Sie Zeichen verwenden, die Sie Ihrem hdpi-Ordner hinzufügen müssten. Ich habe in diesem Beispiel auch nur drei Tabs erstellt.

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 // erneut für die gewünschte Anzahl von Tabs replizieren

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

Stellen Sie sicher, dass Ihre R.java und strings.xml Dateien richtig eingerichtet sind, und dann sollten Sie Ihre Tabs sein in Betrieb.

+0

Ok. Ich werde es überprüfen. Vielen Dank. Ich werde dich später sagen, wenn das für mich funktioniert :) – imarban

+1

Willkommen! froh, dass es geholfen hat –

+0

Können wir Tabs wie iOS nach unten verschieben? – Dharmendra

Verwandte Themen