解決在Android中給Button設定Padding無效的問題
阿新 • • 發佈:2019-01-07
在Xml中給Button設定padding = 0 和用程式碼給Button設定padding = 0 都無效,是因為,這種情況下,Button的寬高是受TextView中的變數:mMinWidth , mMinHeight和View中的變數:mMinWidth , mMinHeight來共同決定的。
首先說一下,TextView是繼承自View的,而Button又是繼承自TextView的,但其實上,Button就是一個TextView,只是重寫了構造方法,傳入了Button的專有Style而已:
public class Button extends TextView {
public Button(Context context) {
this(context, null);
}
public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}
public Button(Context context, AttributeSet attrs, int defStyleAttr) {
this(context, attrs, defStyleAttr, 0 );
}
public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public CharSequence getAccessibilityClassName() {
return Button.class.getName();
}
}
那麼我們來看看TextView的onMeasure()方法:
會獲取到text的寬度,但是在下面還會多次多寬度進行計算,在這兩個地方:
首先,用了一個Math.max(width,mMinWidth)
函式,這裡的mMinWidth就是TextView的mMinWidth,我這個版本的原始碼預設的是176。
然後下面這裡又有一個Math.max()函式,其中是與getSupportedMinimumWidth()
方法進行比較:
protected int getSuggestedMinimumWidth() {
return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
}
getSupportedMinimumWidth()
是View中的方法,所以這裡的mMinWidth是View中的變數,預設的也是176。
所以為什麼設定了padding = 0 之後還是沒有效果,就很明確了。
解決辦法:
在XML中
android:minWidth="0dp"
android:minHeight="0dp"
android:padding="0dp"
這種方法,View中的變數和TextView中的變數是一起賦值的。
在程式碼中:
Button b = (Button) findViewById(R.id.btn);
b.setPadding(0, 0, 0, 0);//設定padding
b.setMinWidth(0);//Button中的方法 改變Button(TextView)中的mMinWidth
b.setMinHeight(0);//Button中的方法 改變Button(TextView)中的mMinHeight
b.setMinimumHeight(0);//View中的方法 改變View中的mMinHeight
b.setMinimumWidth(0);//View中的方法 改變View中的mMinWidth