Question

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>

Was it helpful?

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);
        }
    }
}

OTHER TIPS

mTabHost.getTabWidget().getChildAt(i).getLayoutParams().height = 100;

The same way you set the height, you may set the width to the maximal width of the current layout. Something like this should work:

final Display display = getWindowManager().getDefaultDisplay();
final Point size = new Point();
display.getSize(size);

final WindowManager.LayoutParams params = getWindow().getAttributes();

mTabHost.getTabWidget().getChildAt(i).getLayoutParams().width = (int) params.width * 0.9;

I think setting width to MATCH_PARENT instead of WRAP_CONTENT should work too.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top