如何缩小SwitchCompat的宽度?

时间:2016-11-03 02:40:03

标签: android switchcompat

我想减少Switch的宽度。 How to change the size of a Switch WidgetHow to change Width of Android's Switch track?中的当前解决方案并未解决我的问题。 android:switchMinWidth刚刚定义了minWidth,但我希望它小于2 x thumbWidth大小。

我深入研究SwitchCompat class' onMeasure() function。定义宽度的方式如下。

    // Adjust left and right padding to ensure there's enough room for the
    // thumb's padding (when present).
    int paddingLeft = padding.left;
    int paddingRight = padding.right;
    if (mThumbDrawable != null) {
        final Rect inset = DrawableUtils.getOpticalBounds(mThumbDrawable);
        paddingLeft = Math.max(paddingLeft, inset.left);
        paddingRight = Math.max(paddingRight, inset.right);
    }

    final int switchWidth = Math.max(mSwitchMinWidth,
            2 * mThumbWidth + paddingLeft + paddingRight);
    final int switchHeight = Math.max(trackHeight, thumbHeight);
    mSwitchWidth = switchWidth;
    mSwitchHeight = switchHeight;

我正在考虑使用负填充,但之后就是这一行paddingLeft = Math.max(paddingLeft, inset.left);。我不确定如何将inset设置为具有负值的拇指绘图(我不知道insetOpticalBounds是什么。也许这应该是另一个stackoverflow问题)

任何人都知道如何缩小SwitchCompat的宽度?

更新 我已就此https://code.google.com/p/android/issues/detail?id=227184&thanks=227184&ts=1478485498

向Google提出了请求

1 个答案:

答案 0 :(得分:1)

我可以解决这个挑战的当前方法是使用反射强制在调用mSwitchWidth函数后立即设置onMeasure(...)变量。

public class SwitchCustomWidth extends SwitchCompat {

    //... the needing constructors goes here...    

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        try {
            Field switchWidth = SwitchCompat.class.getDeclaredField("mSwitchWidth");
            switchWidth.setAccessible(true);

            // Using 120 below as example width to set
            // We could use attr to pass in the desire width
            switchWidth.setInt(this, 120);

        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

这不太理想。我希望让其他人提供更好的答案,而不需要反思(或复制整个类来修改类,或者仅仅因为宽度问题而重写自定义Switch)。

如果那里没有解决方案,那么现在最适合帮助其他人面对同样的挑战。