2016-09-07 2 views
0
zeigt

Dies ist, wie ich meine tabLayout einrichten:Android - TabLayout nicht richtig

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    LinearLayout layout=new LinearLayout(this); 

    layout.setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
    layout.setOrientation(LinearLayout.VERTICAL); 

    setContentView(layout); 

    AppBarLayout appBarLayout= (AppBarLayout) getLayoutInflater().inflate(R.layout.toolbar_layout,null); 
    appBarLayout.setLayoutParams(new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); 
    layout.addView(appBarLayout); 
    Toolbar toolbar = new Toolbar(this); 
    appBarLayout.addView(toolbar); 
    toolbar.getLayoutParams().height=150; 
    setSupportActionBar(toolbar); 

    TabLayout tabLayout = new TabLayout(this); 
    tabLayout.setLayoutParams(new AppBarLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,100)); 
    appBarLayout.addView(tabLayout); 

    tabLayout.addTab(tabLayout.newTab().setText("Tab 1")); 
    tabLayout.addTab(tabLayout.newTab().setText("Tab 2")); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 
    tabLayout.setTabMode(TabLayout.MODE_FIXED); 

    final ViewPager viewPager = new ViewPager(this); 
    viewPager.setLayoutParams(new LinearLayoutCompat.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
    viewPager.setId(24234); 
    layout.addView(viewPager); 
} 

Das Problem:

Ich würde die Laschen wie die gesamte Breite zu füllen, ohne in der Mitte zu bleiben.

ich diese im Portrait-Modus, das ist, was ich will:

Portrait mode

aber im Landschaftsmodus bekommen:

Landscape Mode

Jede Hilfe ist willkommen, danke.

UPDATE:

Dinge ändern sich, wenn Tabs mehr geworden als zwei! In diesem Fall bekomme ich dasselbe Verhalten in beiden Modi! Sieht aus wierd ...

Antwort

0

GELöST:

Lösung für mich zwei Felder einstellt (privat) der Klasse TabLayout wird dies durch Reflexion erreicht, mit einem benutzerdefinierten TabLayout:

public class My_TabLayout extends TabLayout { 

public My_TabLayout(Context context) { 

    super(context); 

    initTabs(); 
} 

public My_TabLayout(Context context, AttributeSet attrs) { 

    super(context, attrs); 
    initTabs(); 
} 

public My_TabLayout(Context context, AttributeSet attrs, int defStyleAttr) { 

    super(context, attrs, defStyleAttr); 
    initTabs(); 
} 

private void initTabs(){ 


    Field field; 

    try { 

     int tabs=getTabCount(); 
     if (tabs==0) tabs=1; 
     field = TabLayout.class.getDeclaredField("mRequestedTabMinWidth"); 
     field.setAccessible(true); 

     field.set(this, getWidth()/tabs); 

     field = TabLayout.class.getDeclaredField("mRequestedTabMaxWidth"); 
     field.setAccessible(true); 
     field.set(this, getWidth()/tabs); 
    } 
    catch (NoSuchFieldException e) { 

     e.printStackTrace(); 
    } 
    catch (IllegalAccessException e) { 

     e.printStackTrace(); 
    } 
} 
} 

mit initTabs() -Methode habe ich mein Problem behoben (passiert nur mit zwei Tabs).

Für weitere Informationen: Solution