Android Support Design TabLayout: Gravity Center And Mode Scrollable


Answer :

Tab gravity only effects MODE_FIXED.

One possible solution is to set your layout_width to wrap_content and layout_gravity to center_horizontal:

<android.support.design.widget.TabLayout     android:id="@+id/sliding_tabs"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:layout_gravity="center_horizontal"     app:tabMode="scrollable" /> 

If the tabs are smaller than the screen width, the TabLayout itself will also be smaller and it will be centered because of the gravity. If the tabs are bigger than the screen width, the TabLayout will match the screen width and scrolling will activate.


this is how i did it

TabLayout.xml

<android.support.design.widget.TabLayout             android:id="@+id/tab_layout"             android:layout_height="wrap_content"             android:layout_width="wrap_content"             android:background="@android:color/transparent"             app:tabGravity="fill"             app:tabMode="scrollable"             app:tabTextAppearance="@style/TextAppearance.Design.Tab"             app:tabSelectedTextColor="@color/myPrimaryColor"             app:tabIndicatorColor="@color/myPrimaryColor"             android:overScrollMode="never"             /> 

Oncreate

@Override     protected void onCreate(Bundle savedInstanceState)     {         super.onCreate(savedInstanceState);         setContentView(R.layout.activity_main);         mToolbar = (Toolbar) findViewById(R.id.toolbar_actionbar);         mTabLayout = (TabLayout)findViewById(R.id.tab_layout);         mTabLayout.setOnTabSelectedListener(this);         setSupportActionBar(mToolbar);          mTabLayout.addTab(mTabLayout.newTab().setText("Dashboard"));         mTabLayout.addTab(mTabLayout.newTab().setText("Signature"));         mTabLayout.addTab(mTabLayout.newTab().setText("Booking/Sampling"));         mTabLayout.addTab(mTabLayout.newTab().setText("Calendar"));         mTabLayout.addTab(mTabLayout.newTab().setText("Customer Detail"));          mTabLayout.post(mTabLayout_config);     }      Runnable mTabLayout_config = new Runnable()     {         @Override         public void run()         {             if(mTabLayout.getWidth() < MainActivity.this.getResources().getDisplayMetrics().widthPixels)             {                 mTabLayout.setTabMode(TabLayout.MODE_FIXED);                 ViewGroup.LayoutParams mParams = mTabLayout.getLayoutParams();                 mParams.width = ViewGroup.LayoutParams.MATCH_PARENT;                 mTabLayout.setLayoutParams(mParams);              }             else             {                 mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);             }         }     }; 

I made small changes of @Mario Velasco's solution on the runnable part


As I didn't find why does this behaviour happen I have used the following code:

float myTabLayoutSize = 360; if (DeviceInfo.getWidthDP(this) >= myTabLayoutSize ){     tabLayout.setTabMode(TabLayout.MODE_FIXED); } else {     tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE); } 

Basically, I have to calculate manually the width of my tabLayout and then I set the Tab Mode depending on if the tabLayout fits in the device or not.

The reason why I get the size of the layout manually is because not all the tabs have the same width in Scrollable mode, and this could provoke that some names use 2 lines as it happened to me in the example.


Comments

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?