19

Ich experimentiere derzeit mit verschiedenen neuen Komponenten in der neuen Android Support Design library. Ich habe ein NavigationView in meinem MainActivity.java implementiert, die eine FragmentManager verwendet, um zwischen den Elementen in der Navigationsleiste zu navigieren:Verwenden von TabLayout in einem Fragment; Registerkarte Text unsichtbar

getSupportFragmentManager() 
    .beginTransaction() 
    .replace(R.id.content, mTabLayoutFragment) 
    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN) 
    .commit(); 

Ich bin ein TabLayout in eines des Fragments verwendet wird. Hier ist das Layout des Fragments:

<android.support.design.widget.AppBarLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tabLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     app:tabMode="fixed" 
     app:tabGravity="fill" 
     app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:background="@android:color/white"/> 

</android.support.design.widget.AppBarLayout> 

Und der Java-Code dahinter:

import android.os.Bundle; 
import android.support.design.widget.*; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class TabLayoutFragment extends Fragment { 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View inflatedView = inflater.inflate(R.layout.fragment_tablayout, container, false); 

     TabLayout tabLayout = (TabLayout) inflatedView.findViewById(R.id.tabLayout); 
     tabLayout.addTab(tabLayout.newTab().setText("Campusplan")); 
     tabLayout.addTab(tabLayout.newTab().setText("Raumplan")); 
     final ViewPager viewPager = (ViewPager) inflatedView.findViewById(R.id.viewpager); 

     viewPager.setAdapter(new PagerAdapter 
       (getFragmentManager(), tabLayout.getTabCount())); 
     viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 

     return inflatedView; 
    } 

    public class PagerAdapter extends FragmentStatePagerAdapter { 
     int mNumOfTabs; 

     public PagerAdapter(FragmentManager fm, int NumOfTabs) { 
      super(fm); 
      this.mNumOfTabs = NumOfTabs; 
     } 

     @Override 
     public Fragment getItem(int position) { 

      switch (position) { 
       case 0: 
        TabItem1 tab1 = new TabItem1(); 
        return tab1; 
       case 1: 
        TabItem1 tab2 = new TabItem1(); 
        return tab2; 
       default: 
        return null; 
      } 
     } 

     @Override 
     public int getCount() { 
      return mNumOfTabs; 
     } 
    } 
} 

Bitte beachten Sie TabItem1 und TabItem1, die Fragmente sind, die aus nichts anderes als ein Textview. Diese beiden sollen im TabLayout angezeigt werden.

Nun scheint dieser Code zu einem gewissen Grad zu funktionieren. Hier ist, wie es aussieht:

Was seltsam ist, nachdem ich das Gerät drehen , alles scheint ganz gut zu funktionieren:

enter image description here

Es scheint so etwas bekommt eine Konfigurationsänderung aufgerufen. Das ist seltsam, besonders wenn man bedenkt, dass ich in meinem AndroidManifest folgenden:

android:configChanges="orientation|screenSize" 
+2

Update: Dies war aufgrund eines Fehlers in der Design-Bibliothek 22.2.1. Die Verwendung von 23.0.0 löst dies. – Tapirboy

Antwort

30

I Das gleiche Problem mit der neuen Version von Android-Support Design Library v23.1.1. Aber ich finde es heraus, was passiert.

wenn Ihre Ansicht Pager 2-Fragment als erwähnt hat oben, dann setzen Sie die Ansicht Pager mit dieser Aussage:

tabLayout.setupWithViewPager(viewPager); 

automatisch Sie 2 Tabs mit leeren Text haben. Sie sollten also keine neue Registerkarte mehr hinzufügen. Aber etwas, was Sie tun müssen, ist Text in diesem zwei erstellten Registerkarten.

tabLayout.getTabAt(0).setText("Campusplan"); 
tabLayout.getTabAt(1).setText("Raumplan"); 

Fazit.Um Registerkarten Arbeit zu machen, wie Sie wollen, wichtig, was Sie zu tun haben:

tabLayout.setupWithViewPager(viewPager); 
tabLayout.getTabAt(0).setText("Campusplan"); 
tabLayout.getTabAt(1).setText("Raumplan"); 

Ich hoffe, dass dies hilfreich sein wird für Sie :)

+1

Das ist korrekt answear für mich. Wie oben erwähnt, funktioniert für die Unterstützung Design-Bibliothek 23.1.1. Danke :) –

+1

gute Antwort. Vielen Dank. – AlexDG

+0

aber warum das nicht funktioniert tabLayout.addTab (tabLayout.newTab(). SetText ("Campusplan")); tabLayout.addTab (tabLayout.newTab(). SetText ("Raumplan")); – abh22ishek

18

Update: Design Bibliothek v23.0.0 dieses Problem löst.


das Problem hier gefunden: https://code.google.com/p/android/issues/detail?id=180462

einfache Abhilfe:

tabLayout.post(new Runnable() { 
    @Override 
    public void run() { 
     tabLayout.setupWithViewPager(viewPager); 
    } 
}); 
+0

Du hast meinen Tag gerettet! –

+1

Die Tabs sind jetzt in Ordnung, aber manchmal, wenn ich zwischen den Navigationsschubladen-Elementen wechsle, verschwindet das innere Fragment dieses TabLayouts. Hast du deinen Code auf Github zu sehen? –

+0

@MarioVelasco hier ist es: http://pastebin.com/jEB9FkBy – jacobz

2

Der Entwickler auf dieser Bibliothek arbeiten empfiehlt die folgende Arbeit-a-Runde:

if (ViewCompat.isLaidOut(tabLayout)) { 
     tabLayout.setupWithViewPager(viewPager); 
    } else { 
     tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
      @Override 
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
       tabLayout.setupWithViewPager(viewPager); 
       tabLayout.removeOnLayoutChangeListener(this); 
      } 
     }); 
    } 
0

Mangel Ruf Kommentar @arif Ardiansyah ...

überprüfen Sie den Quellcode:

`TabLayout#setupWithViewPager(...)` 

-->>`setPagerAdapter(adapter, true);` 

-->>`populateFromPagerAdapter();` 

Hier TabLayout entfernt alle Registerkarten und erstellt einige neue Registerkarten, deren Text gesetzt mit PagerAdapter#getPageTitle(...). Sie können diese Methode überschreiben, um Tablayout mit dem Titel Ihrer Registerkarte anzugeben.

4

nur versucht, das Verfahren in Adapter außer Kraft zu setzen:

public CharSequence getPageTitle(int position) {}

und es funktioniert.

+0

guter Fang! Danke! –

Verwandte Themen