无法全局更改材质按钮的边距

时间:2020-05-28 09:18:48

标签: android material-design

我正在尝试更改应用程序中所有按钮的边距。我定义了样式:

<resources>
    <style name="AppTheme" parent="Theme.MaterialComponents.Light.DarkActionBar">
        <item name="materialButtonStyle">@style/TempButtonStyle</item>
    </style>

    <style name="TempButtonStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:layout_margin">10dp</item>
    </style>
 </resources>

但不起作用。 如果我将此样式附加到单个按钮上,则效果很好:

<com.google.android.material.button.MaterialButton
        android:id="@+id/change_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/change_date"
        style="@style/TempButtonStyle"/>

有人建议如何在全球进行更改吗?

2 个答案:

答案 0 :(得分:1)

为了全局更改“材质按钮”的边距,需要使用以下样式的inset

<style name="TempButtonStyle" parent="Widget.MaterialComponents.Button">
        <item name="android:insetLeft">10dp</item>
        <item name="android:insetRight">10dp</item>
        <item name="android:insetBottom">10dp</item>
        <item name="android:insetTop">10dp</item>
</style>

答案 1 :(得分:0)

只要答案一直存在,我就一直在寻找解决方案,但没有解决方案。如果要像在问题中一样全局定义Buttonstyle,则至少没有。

问题如下:您可能知道LayoutParams绑定到特定的ViewGroup类型(如LinearLayout或FrameLayout)。这将导致以下问题:您已经以自己的样式定义了layout_margin,该样式已在全局materialButtonStyle上应用。但是,要应用此属性(和任何布局属性),必须知道View的父级。这就是设置style="@style/TempButtonStyle"起作用的原因。

那么最简单的解决方法是什么?
我知道这并不理想,但是可以通过扩展MaterialButton并以编程方式设置边距来解决此问题:

只需重写onMeasure并在其内部执行以下操作(超级调用之后):

MarginLayoutParams::class.java.cast(layoutParams)?.apply {
    topMargin = 30
    bottomMargin = 30
    leftMargin = 30
    rightMargin = 30
    layoutParams = this
}

或Java:

    MarginLayoutParams margins = MarginLayoutParams.class.cast(getLayoutParams());
    margins.topMargin = 30;
    margins.bottomMargin = 30;
    margins.leftMargin = 30;
    margins.rightMargin = 30;
    setLayoutParams(margins);

(当然,您不想使用硬编码的值并从已定义的尺寸或使用typedvalue来获取10dp)

相关问题