我想减少Switch的宽度。 How to change the size of a Switch Widget和How 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
设置为具有负值的拇指绘图(我不知道inset
或OpticalBounds
是什么。也许这应该是另一个stackoverflow问题)
任何人都知道如何缩小SwitchCompat的宽度?
更新 我已就此https://code.google.com/p/android/issues/detail?id=227184&thanks=227184&ts=1478485498
向Google提出了请求答案 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)。
如果那里没有解决方案,那么现在最适合帮助其他人面对同样的挑战。