Search code examples
androidandroid-fragmentstabsandroid-tabhost

TabHost Button Sizing Error


I am using a TabHost to hold 3 fragments and have created a method that sets the Tab selected/unselected background colors. The background colors are drawn using a drawable xml file. The problem that I am getting is when a tab is selected, the width is adjusted for the actual tab buttons. They need to stay the same size no matter what. How would this be fixed?

Tab buttons showing the sizing error

@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
private void setSelectedTabColor() {
    RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(
            ViewGroup.LayoutParams.WRAP_CONTENT,
            ViewGroup.LayoutParams.WRAP_CONTENT);
    rllp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
    rllp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    int textSize = 22;

    int current = mTabHost.getCurrentTab();
    for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {
        TextView txt = (TextView) mTabHost.getTabWidget().getChildAt(i)
                .findViewById(android.R.id.title);
        txt.setTextSize(textSize);
        txt.setTypeface(font);
        txt.setLayoutParams(rllp);
        txt.setGravity(Gravity.RIGHT);
        mTabHost.getTabWidget().getChildAt(i).getLayoutParams().height = 100;
        if (i == current) {
            mTabHost.getTabWidget().getChildAt(i)
                    .setBackgroundResource(R.drawable.button_type1_active);
        } else {
            mTabHost.getTabWidget().getChildAt(i)
                    .setBackgroundResource(R.drawable.button_type1);
            txt.setTextColor(Color.WHITE);
        }
    }
}

button_type1.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true"><layer-list>
        <item><shape>

                <!-- Gradient Bg for Button -->
                <gradient android:angle="270" android:endColor="@color/button_type1_pushed" android:startColor="@color/button_type1_pushed" />

                <stroke android:width="0.05dp" android:color="@color/button_type1_border" />
            </shape></item>
    </layer-list></item>
<item android:state_enabled="true"><layer-list>
        <item><shape android:shape="rectangle">
                <gradient android:angle="90" android:endColor="@color/button_type1_normal" android:startColor="@color/button_type1_normal" />

                <stroke android:width="0.05dp" android:color="@color/button_type1_border" />
            </shape></item>
    </layer-list></item>

button_type1_active.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true"><layer-list>
        <item><shape>

                <!-- Gradient Bg for Button -->
                <gradient android:angle="270" android:endColor="@color/button_type1_pushed" android:startColor="@color/button_type1_pushed" />

                <stroke android:width="0.05dp" android:color="@color/button_type1_border" />
            </shape></item>
    </layer-list></item>
<item android:state_enabled="true"><layer-list>
        <item><shape android:shape="rectangle">
                <gradient android:angle="90" android:endColor="@color/button_type1_active" android:startColor="@color/button_type1_active" />

                <stroke android:width="0.05dp" android:color="@color/button_type1_border" />
            </shape></item>
    </layer-list></item>


Solution

  • This is the code that was used to fix the problem. Setting the padding for the parent View to 0 was necessary:

    private void setSelectedTabColor() {
        RelativeLayout.LayoutParams rllp = new RelativeLayout.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.FILL_PARENT);
        rllp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
        rllp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
        int textSize = 22;
        final WindowManager.LayoutParams params = getWindow().getAttributes();
    
        View currentView;
        int current = mTabHost.getCurrentTab();
        for (int i = 0; i < mTabHost.getTabWidget().getChildCount(); i++) {
            TextView txt = (TextView) mTabHost.getTabWidget().getChildAt(i)
                    .findViewById(android.R.id.title);
            txt.setTextSize(textSize);
            txt.setTypeface(font);
            txt.setLayoutParams(rllp);
            txt.setGravity(Gravity.RIGHT | Gravity.BOTTOM);
            currentView = mTabHost.getTabWidget().getChildAt(i);
            LinearLayout.LayoutParams currentLayout = (LinearLayout.LayoutParams) currentView
                    .getLayoutParams();
            currentLayout.setMargins(0, 0, 0, 0);
            currentView.setPadding(0, 0, 0, 0);
            currentView.setLayoutParams(currentLayout);
            currentView.getLayoutParams().height = 100;
            if (i == current) {
                mTabHost.getTabWidget().getChildAt(i)
                        .setBackgroundResource(R.drawable.button_type1_active);
                txt.setBackgroundResource(R.drawable.button_type1_active);
            } else {
                mTabHost.getTabWidget().getChildAt(i)
                        .setBackgroundResource(R.drawable.button_type1);
                txt.setBackgroundResource(R.drawable.button_type1);
                txt.setTextColor(Color.WHITE);
            }
            if(i==0||i==1){
                txt.setPadding(0, 0, 5, 0);
            }
        }
    }