2015-11-17 2 views
0

У меня есть активность в приложении для Android, которое содержит TabLayout для переключения между различными фрагментами. Я внедрил пользовательский FragmentStatePagerAdapter, чтобы вставлять мои столбцы и инициализировать его в рамках моей операции с помощью метода tabLayout.setupWithViewPager (mViewPager).Фиксирование элементов TabLayout на экран

Моя проблема заключается в том, что в случае я использую TabLayout.MODE_FIXED в моем tabLayout я в конечном итоге с одним из элементов, т.е. дискуссий, так как искажается, как на картинке ниже:

tabLayout with TabLayout.MODE_FIXED

И в другом случае, если я использую TabLayout.MODE_SCROLLABLE, в итоге все предопределенные элементы моего tabLayout сжимаются в левом углу приложения с большим количеством свободного пространства, независимо от того, какой гравитацией я укажу как таковой:

tabLayout with TabLayout.MODE_SCROLLABLE

Результат:

1) TabLayout в фиксированном режиме, который не имеет двух слоев или перекрывающихся элементов;

2) TabLayout в прокручиваемом режиме, который по крайней мере покрывает все свободное пространство и/или покрывает более заданное пространство, поскольку оно будет приемлемым, если пользователь может прокручивать в TabLayout для просмотра и доступа к невидимым вкладкам.

Связанные коды источников и ресурсов приведены ниже. Если какой-либо случай больше информации, пожалуйста, дайте мне знать.

Мой код вида деятельности:

import android.os.Bundle; 
import android.support.design.widget.TabLayout; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.Menu; 
import android.view.MenuItem; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import swe574.boun.edu.androidproject.adapters.GroupTabPagerAdapter; 

public class GroupActivity extends AppCompatActivity { 

    /** 
    * The {@link android.support.v4.view.PagerAdapter} that will provide 
    * fragments for each of the sections. We use a 
    * {@link FragmentPagerAdapter} derivative, which will keep every 
    * loaded fragment in memory. If this becomes too memory intensive, it 
    * may be best to switch to a 
    * {@link android.support.v4.app.FragmentStatePagerAdapter}. 
    */ 
    private GroupTabPagerAdapter mSectionsPagerAdapter; 

    /** 
    * The {@link ViewPager} that will host the section contents. 
    */ 
    private ViewPager mViewPager; 
    private List<String> mTitles; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_group); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     // Create the adapter that will return a fragment for each of the three 
     // primary sections of the activity. 
     mTitles = new ArrayList<>(); 
     mTitles.addAll(Arrays.asList(new String[]{"Home" , "Meetings" , "Discussions" , "Notes"})); 
     mSectionsPagerAdapter = new GroupTabPagerAdapter(getSupportFragmentManager(), mTitles, 4); 

     // Set up the ViewPager with the sections adapter. 
     mViewPager = (ViewPager) findViewById(R.id.container); 
     mViewPager.setAdapter(mSectionsPagerAdapter); 

     TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); 
     tabLayout.setupWithViewPager(mViewPager); 
     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); 
     tabLayout.setTabGravity(TabLayout.GRAVITY_CENTER); 

    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_group, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

} 

Мой GroupTabPagerAdapter код:

import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 

import java.util.List; 

import swe574.boun.edu.androidproject.fragments.DiscussionFragment; 
import swe574.boun.edu.androidproject.fragments.GroupHomeFragment; 
import swe574.boun.edu.androidproject.fragments.MeetingFragment; 
import swe574.boun.edu.androidproject.fragments.NoteFragment; 

public class GroupTabPagerAdapter extends FragmentStatePagerAdapter { 
    private List<String> mTitles; 
    private int mNumOfTabs; 

    public GroupTabPagerAdapter(FragmentManager fm, List<String> mTitles, int mNumOfTabs) { 
     super(fm); 
     this.mTitles = mTitles; 
     this.mNumOfTabs = mNumOfTabs; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment fragment = null; 
     switch (position) { 
      case 0: 
       fragment = new GroupHomeFragment(); 
       break; 
      case 1: 
       fragment = new MeetingFragment(); 
       break; 
      case 2: 
       fragment = new DiscussionFragment(); 
       break; 
      case 3: 
       fragment = new NoteFragment(); 
       break; 
     } 
     return fragment; 
    } 

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

    @Override 
    public CharSequence getPageTitle(int position) { 
     return mTitles.get(position); 
    } 


} 

Моя активность Компоновка:

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="swe574.boun.edu.androidproject.GroupActivity"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appbar" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingTop="@dimen/appbar_padding_top" 
     android:theme="@style/AppTheme.AppBarOverlay"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:popupTheme="@style/AppTheme.PopupOverlay"> 

     </android.support.v7.widget.Toolbar> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

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

    <android.support.v4.view.ViewPager 
     android:id="@+id/container" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

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

Спасибо за помощь.

ответ

1

исправить эту проблему с расширением TabLayout в пользовательском классе и переопределение метода onMeasure с этим:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
    try { 
     if (getTabCount() == 0){ 
      return; 
     } 
     Field field = TabLayout.class.getDeclaredField("mTabMinWidth"); 
     field.setAccessible(true); 
     field.set(this, (int) (getMeasuredWidth()/(float) getTabCount()) * 1); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
Смежные вопросы