Remove line break in TabLayout

后端 未结 8 1994
自闭症患者
自闭症患者 2020-11-27 05:30

I just added the new TabLayout component to my app. As you may know there are two different modes for tabs app:tabMode=\"scrollable\" and app:tabMode=\"fi

相关标签:
8条回答
  • 2020-11-27 05:38

    One solution here is to inflate a custom layout for each tab, which will give you more control over the appearance of each tab. This is done with the setCustomView() method.

    Note that it will look different on different screen resolutions.

    It's always tough to make it look perfect on every device, but at least using this method gives you more control, as you can use different custom layout xml files for different screen resolutions/sizes.

    One approach would be to make the font size as big as possible without getting cut off on each screen size.

    I got a simple example working, which restricts the text in each tab to one line, however in this simple example it also causes the long text in the side tabs to ellipsize without changing the font size. Your next step would be to figure out the optimal font size for each screen size, and create a specific tab layout xml for each.

    Here is the custom_tab.xml file, with android:singleLine="true" specified:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/custom_text"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:background="?attr/selectableItemBackground"
            android:gravity="center"
            android:textSize="16dip"
            android:textColor="#ffffff"
            android:singleLine="true"
            />
    </LinearLayout>
    

    Here is the layout for MainActivity:

    <RelativeLayout
        android:id="@+id/main_layout"
        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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:background="?attr/colorPrimary"
            android:elevation="6dp"
            android:minHeight="?attr/actionBarSize"
            android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout"
            app:tabMode="fixed"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/toolbar"
            android:background="?attr/colorPrimary"
            android:elevation="6dp"
            app:tabTextColor="#d3d3d3"
            app:tabSelectedTextColor="#ffffff"
            app:tabIndicatorColor="#ff00ff"
            android:minHeight="?attr/actionBarSize"
            />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@id/tab_layout"/>
    
    </RelativeLayout>
    

    Here is the Activity code, which includes the FragmentPagerAdapter:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
    
            // Get the ViewPager and set it's PagerAdapter so that it can display items
            ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
            PagerAdapter pagerAdapter =
                    new PagerAdapter(getSupportFragmentManager(), MainActivity.this);
            viewPager.setAdapter(pagerAdapter);
    
            // Give the TabLayout the ViewPager
            TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
            tabLayout.setupWithViewPager(viewPager);
    
            // Iterate over all tabs and set the custom view
            for (int i = 0; i < tabLayout.getTabCount(); i++) {
                TabLayout.Tab tab = tabLayout.getTabAt(i);
                tab.setCustomView(pagerAdapter.getTabView(i));
            }
        }
    
    
        class PagerAdapter extends FragmentPagerAdapter {
    
            String tabTitles[] = new String[] { "Aufzeichnung", "Berichte", "Neue Aufgabe", };
            Context context;
    
            public PagerAdapter(FragmentManager fm, Context context) {
                super(fm);
                this.context = context;
            }
    
            @Override
            public int getCount() {
                return tabTitles.length;
            }
    
            @Override
            public Fragment getItem(int position) {
    
                switch (position) {
                    case 0:
                        return new BlankFragment();
                    case 1:
                        return new BlankFragment();
                    case 2:
                        return new BlankFragment();
                }
    
                return null;
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                // Generate title based on item position
                return tabTitles[position];
            }
    
            public View getTabView(int position) {
                View tab = LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_tab, null);
                TextView tv = (TextView) tab.findViewById(R.id.custom_text);
                tv.setText(tabTitles[position]);
                return tab;
            }
    
        }
    }
    

    And here is the result with the code above:

    Note that if you remove android:singleLine="true", it looks like this, similar to how it looks in your question:

    0 讨论(0)
  • 2020-11-27 05:38

    If it is an option you could center the tabs with a RelativeLayout and by setting android:layout_centerHorizontal="true"

    This will give you an equal margin on both the left and right side.

    e.g.

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <android.support.design.widget.TabLayout
                android:id="@+id/tabs"
                android:layout_centerHorizontal="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:tabMode="scrollable" />
        </RelativeLayout>
    
    0 讨论(0)
  • 2020-11-27 05:38

    Solved my problem by assigning style to app:tabTextAppearance

    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabTextAppearance="@style/MyCustomTabTextAppearance">
    

    style:

    <style name="MyCustomTabTextAppearance" parent="@style/AppTheme">
        <item name="android:singleLine">true</item>
        <item name="android:textSize">@dimen/_5sdp</item>
    </style>
    

    You can set textSize also.

    0 讨论(0)
  • 2020-11-27 05:39

    In your layout XML, if You are usign TextView ,use android:maxLines="1" or android:singleLine="true" See if this works. And if Not TextView then please put your xml here.

    0 讨论(0)
  • 2020-11-27 05:52

    With this code you are able to remove the default padding. For me it worked to make slightly longer texts within one line

    <android.support.design.widget.TabLayout
    app:tabPaddingStart="-1dp"
    app:tabPaddingEnd="-1dp"
    

    From here: http://panavtec.me/playing-with-the-new-support-tablayout

    0 讨论(0)
  • 2020-11-27 06:01

    Here's a quick hack, a lot shorter than using setCustomView(): use the android:theme attribute on your TabLayout:

    <android.support.design.widget.TabLayout
        android:id="@+id/tab_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/TabLayout_Theme"
        app:tabMode="fixed"/>
    

    Then in your themes XML:

    <style name="TabLayout_Theme" parent="@style/AppTheme">
        <item name="android:singleLine">true</item>
    </style>
    

    We have to do it this way, because unfortunately the android:singleLine attribute is ignored on the app:tabTextAppearance set on the TabLayout. app:tabTextAppearance is really only useful for changing text size.

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