1. 程式人生 > >解決在Android中給Button設定Padding無效的問題

解決在Android中給Button設定Padding無效的問題

在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