Changing TabLayout icons on left, top, right or bottom in com.android.support:design:23.1.0

后端 未结 4 1842
走了就别回头了
走了就别回头了 2020-12-23 15:06

I\'m pretty new to android development. So bear with me.

I\'ve been trying to align the icon and text in same line in com.android.support:design:23.1.0

相关标签:
4条回答
  • 2020-12-23 15:11

    Thank you Atu for this good tip!

    In my case, I have to add a linear layout to center tablayout title. I have also added some space characters to get margin between the icon and the text.

    custom_tab.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:gravity="center">
        <TextView
            android:id="@+id/tabContent"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:textAlignment="center"
            android:textColor="@android:color/white"
            android:gravity="center"/>
    </LinearLayout>
    

    Initialization code:

    LinearLayout tabLinearLayout = (LinearLayout) LayoutInflater.from(this).inflate(R.layout.custom_tab, null);
    TextView tabContent = (TextView) tabLinearLayout.findViewById(R.id.tabContent);
    tabContent.setText("  "+getApplicationContext().getResources().getString(tabTitles[i]));
    tabContent.setCompoundDrawablesWithIntrinsicBounds(tabIcons[i], 0, 0, 0);
    mTabLayout.getTabAt(i).setCustomView(tabContent);
    
    0 讨论(0)
  • 2020-12-23 15:14

    I have exact solution which you guys want.

    <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:tabInlineLabel="true"
        app:tabPaddingStart="@dimen/default_10dp">
    

    Using below property you can achive desire result.

    app:tabInlineLabel="true"

    0 讨论(0)
  • 2020-12-23 15:22

    Use the same xml code given by @juzamn and just add this little adjustments to loop for the entire tab

    for (int i = 0; i < tabLayout.getTabCount(); i++ ) {
     yourlinearlayout = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.title_text, null);
     tab_text = (TextView) yourlinearlayout.findViewById(R.id.tabContent);
            tab_text.setText("  " + tab_titles[i]);
     tab_text.setCompoundDrawablesWithIntrinsicBounds(tabicons[i], 0, 0, 0);
        tabLayout.getTabAt(i).setCustomView(tab_text);}
    
    0 讨论(0)
  • 2020-12-23 15:33

    Actually, I have found a more elegant way (IMO) to do this without even using custom layouts, and just using the current default layout for tablayouts. Each tab layout item is in fact a Vertical LinearLayout, with the 1st item being an ImageView, and the 2nd item the TextView.

    So the method consists of changing the tab's LinearLayout orientation to Horizontal. After that, the icon will be positioned on the left. Now, if you want to position it on the right, you can remove the ImageView (which is the 1st item) and add it to the LinearLayout, it will be added as the last element so positioned at the end of the TextView, but you will have to play around with the layout params in order to display it aligned and sized correctly.

    So instead of re-adding the ImageView at the end of the LinearLayout, you can just add the drawable as a compound drawable to the TextView. add a little padding to it, and voila.

    LinearLayout tabItemLayout = (LinearLayout)((LinearLayout)tabLayout.getChildAt(0)).getChildAt(tabIndex);
    tabItemLayout.setOrientation(LinearLayout.HORIZONTAL);
    ImageView iconView = (ImageView) tabItemLayout.getChildAt(0);
    TextView textView = (TextView) tabItemLayout.getChildAt(1);
    // remove the icon view
    tabItemLayout.removeView(iconView);
    // add the icon as compound drawable
    textView.setCompoundDrawablesWithIntrinsicBounds(null, null, iconView.getDrawable(), null);
    // set some padding
    float DP = Resources.getSystem().getDisplayMetrics().density;
    int padding = (int)(10 * DP);
    textView.setCompoundDrawablePadding(padding);
    

    With this method, we don't need a custom layout and don't need to inflate anything, we just re-use the existing views.

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