Невозможно изменить поле кнопки материала глобально - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь изменить поле для всех моих кнопок в приложении. Я определил стиль:

<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 ]

1 голос
/ 28 мая 2020

Чтобы изменить поле для кнопки материала глобально, необходимо использовать 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>
0 голосов
/ 28 мая 2020

Я пытался найти решение, пока был ответ, но его нет. По крайней мере, нет, если вы хотите определить стиль кнопок глобально, как вы это сделали в своем вопросе.

Проблема в следующем: как вы, вероятно, знаете, LayoutParams привязаны к определенному типу c ViewGroup (например, LinearLayout или FrameLayout). Это вызывает следующую проблему: Вы определили layout_margin в своем стиле, который применяется глобально vai materialButtonStyle. Однако для применения этого атрибута (и любого атрибута макета) родительский элемент представления должен быть известен. Вот почему установка 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);

( конечно, вы не хотите использовать жестко запрограммированное значение и получать 10dp либо из определенного измерения, либо с помощью typedvalue)

...