Android Support Design TabLayout: Gravity Center and Mode Scrollable

前端 未结 13 1990

I am trying to use the new Design TabLayout in my project. I want the layout to adapt to every screen size and orientation, but it can be seen correctly in one orientation.<

相关标签:
13条回答
  • 2020-12-02 07:02

    Very simple example and it always works.

    /**
     * Setup stretch and scrollable TabLayout.
     * The TabLayout initial parameters in layout must be:
     * android:layout_width="wrap_content"
     * app:tabMaxWidth="0dp"
     * app:tabGravity="fill"
     * app:tabMode="fixed"
     *
     * @param context   your Context
     * @param tabLayout your TabLayout
     */
    public static void setupStretchTabLayout(Context context, TabLayout tabLayout) {
        tabLayout.post(() -> {
    
            ViewGroup.LayoutParams params = tabLayout.getLayoutParams();
            if (params.width == ViewGroup.LayoutParams.MATCH_PARENT) { // is already set up for stretch
                return;
            }
    
            int deviceWidth = context.getResources()
                                     .getDisplayMetrics().widthPixels;
    
            if (tabLayout.getWidth() < deviceWidth) {
                tabLayout.setTabMode(TabLayout.MODE_FIXED);
                params.width = ViewGroup.LayoutParams.MATCH_PARENT;
            } else {
                tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
                params.width = ViewGroup.LayoutParams.WRAP_CONTENT;
            }
            tabLayout.setLayoutParams(params);
    
        });
    
    }
    
    0 讨论(0)
  • 2020-12-02 07:04
     <android.support.design.widget.TabLayout
                        android:id="@+id/tabList"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        app:tabMode="scrollable"/>
    
    
    0 讨论(0)
  • 2020-12-02 07:04

    My final solution

    class DynamicModeTabLayout : TabLayout {
    
        constructor(context: Context?) : super(context)
        constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
        constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
    
        override fun setupWithViewPager(viewPager: ViewPager?) {
            super.setupWithViewPager(viewPager)
    
            val view = getChildAt(0) ?: return
            view.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED)
            val size = view.measuredWidth
    
            if (size > measuredWidth) {
                tabMode = MODE_SCROLLABLE
                tabGravity = GRAVITY_CENTER
            } else {
                tabMode = MODE_FIXED
                tabGravity = GRAVITY_FILL
            }
        }
    }
    
    0 讨论(0)
  • 2020-12-02 07:08

    This is the solution I used to automatically change between SCROLLABLE and FIXED+FILL. It is the complete code for the @Fighter42 solution:

    (The code below shows where to put the modification if you've used Google's tabbed activity template)

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        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.
        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
    
        // Set up the ViewPager with the sections adapter.
        mViewPager = (ViewPager) findViewById(R.id.container);
        mViewPager.setAdapter(mSectionsPagerAdapter);
    
        // Set up the tabs
        final TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
        tabLayout.setupWithViewPager(mViewPager);
    
        // Mario Velasco's code
        tabLayout.post(new Runnable()
        {
            @Override
            public void run()
            {
                int tabLayoutWidth = tabLayout.getWidth();
    
                DisplayMetrics metrics = new DisplayMetrics();
                ActivityMain.this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
                int deviceWidth = metrics.widthPixels;
    
                if (tabLayoutWidth < deviceWidth)
                {
                    tabLayout.setTabMode(TabLayout.MODE_FIXED);
                    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
                } else
                {
                    tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
                }
            }
        });
    }
    

    Layout:

        <android.support.design.widget.TabLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal" />
    

    If you don't need to fill width, better to use @karaokyo solution.

    0 讨论(0)
  • 2020-12-02 07:10

    keeps things simple just add app:tabMode="scrollable" and android:layout_gravity= "bottom"

    just like this

    <android.support.design.widget.TabLayout
    android:id="@+id/tabs"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize"
    android:layout_gravity="bottom"
    app:tabMode="scrollable"
    app:tabIndicatorColor="@color/colorAccent" />
    

    0 讨论(0)
  • 2020-12-02 07:16

    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

    0 讨论(0)
提交回复
热议问题