我正在尝试更改应用程序中所有按钮的边距。我定义了样式:
<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"/>
有人建议如何在全球进行更改吗?
答案 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)