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>

有帮助吗?

解决方案

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

其他提示

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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top