无法设置自定义按钮的样式
Unable to style custom button
我正在尝试设置自定义按钮的样式 - 但我在 styles.xml
中声明的大部分样式都没有应用。
<!-- styles.xml -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="selectableFlatButton">@style/SelectableFlatButton</item>
</style>
<style name="SelectableFlatButton" parent="FlatButton">
<item name="backgroundTint">@color/bg_selectable_button_color</item>
<item name="android:textColor">@color/selectable_button_text_color</item>
<item name="iconTint">@color/selectable_button_text_color</item>
</style>
<style name="FlatButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
<item name="android:elevation">0dp</item>
<item name="cornerRadius">0dp</item>
<item name="backgroundTint">@color/gray98</item>
<item name="rippleColor">@color/colorPrimaryLight</item>
<item name="android:textColor">@color/colorPrimary</item>
<item name="android:selectable">true</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:textAllCaps">false</item>
<item name="iconGravity">textStart</item>
<item name="iconTint">@color/colorPrimary</item>
</style>
<!-- attrs.xml -->
<resources>
<attr name="selectableFlatButton" format="reference" />
</resources>
按钮实现。它所做的只是设置默认样式。
import android.content.Context
import android.util.AttributeSet
import android.widget.Button
import com.guyca.R
class SelectableFlatButton(context: Context, attrs: AttributeSet? = null) : Button(context, attrs, R.attr.selectableFlatButton)
布局文件中的用法:
<com.guyca.SelectableFlatButton
android:id="@+id/selectButton"
android:layout_width="0dp"
android:layout_height="56dp"
android:text="@string/select"
app2:icon="@drawable/ic_delete_sweep_24dp" />
如果相反,如果使用我的 SelectableFlatButton
,我使用机器人的 Button
并将样式作为 style="@style/SelectableFlatButton"
传递 - 它看起来符合预期。
似乎唯一有效的样式属性是 android:textAllCaps
和 android:textColor
- 其余的对我的 Button 没有影响。
由于您使用的是 MaterialTheme,因此您可以扩展 MaterialButton
:
class SelectableFlatButton(context: Context, attrs: AttributeSet? = null) :
MaterialButton(context, attrs, R.attr.selectableFlatButton)
然后定义默认属性样式:
<style name="AppTheme" parent="Theme.MaterialComponents.*">
<item name="selectableFlatButton">@style/SelectableFlatButton</item>
...
</style>
和:
<!-- Custom -->
<style name="FlatButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
<item name="elevation">0dp</item>
<item name="cornerRadius">0dp</item>
<item name="backgroundTint">@color/...</item>
<item name="rippleColor">@color/....</item>
<item name="android:textColor">@color/....</item>
<item name="android:insetTop">...</item>
<item name="android:insetBottom">...</item>
<item name="android:textAppearance">@style/MyTextAppearance.MaterialComponents</item>
<item name="android:selectable">true</item>
<item name="iconGravity">textStart</item>
<item name="iconTint">@color/....</item>
</style>
<style name="MyTextAppearance.MaterialComponents" parent="TextAppearance.MaterialComponents.Button">
<item name="android:textAllCaps">false</item>
</style>
<style name="SelectableFlatButton" parent="FlatButton">
<item name="backgroundTint">@color/...</item>
<item name="android:textColor">@color/...</item>
<item name="iconTint">@color/....</item>
</style>
在您的布局中使用:
<com.google.android.material.button.MaterialButton
app:icon="@drawable/...."
style="@style/SelectableFlatButton"
../>
<com.xxxx.SelectableFlatButton
app:icon="@drawable/..."
.../>
你有相同的结果。
我正在尝试设置自定义按钮的样式 - 但我在 styles.xml
中声明的大部分样式都没有应用。
<!-- styles.xml -->
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="selectableFlatButton">@style/SelectableFlatButton</item>
</style>
<style name="SelectableFlatButton" parent="FlatButton">
<item name="backgroundTint">@color/bg_selectable_button_color</item>
<item name="android:textColor">@color/selectable_button_text_color</item>
<item name="iconTint">@color/selectable_button_text_color</item>
</style>
<style name="FlatButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
<item name="android:elevation">0dp</item>
<item name="cornerRadius">0dp</item>
<item name="backgroundTint">@color/gray98</item>
<item name="rippleColor">@color/colorPrimaryLight</item>
<item name="android:textColor">@color/colorPrimary</item>
<item name="android:selectable">true</item>
<item name="android:insetTop">0dp</item>
<item name="android:insetBottom">0dp</item>
<item name="android:textAllCaps">false</item>
<item name="iconGravity">textStart</item>
<item name="iconTint">@color/colorPrimary</item>
</style>
<!-- attrs.xml -->
<resources>
<attr name="selectableFlatButton" format="reference" />
</resources>
按钮实现。它所做的只是设置默认样式。
import android.content.Context
import android.util.AttributeSet
import android.widget.Button
import com.guyca.R
class SelectableFlatButton(context: Context, attrs: AttributeSet? = null) : Button(context, attrs, R.attr.selectableFlatButton)
布局文件中的用法:
<com.guyca.SelectableFlatButton
android:id="@+id/selectButton"
android:layout_width="0dp"
android:layout_height="56dp"
android:text="@string/select"
app2:icon="@drawable/ic_delete_sweep_24dp" />
如果相反,如果使用我的 SelectableFlatButton
,我使用机器人的 Button
并将样式作为 style="@style/SelectableFlatButton"
传递 - 它看起来符合预期。
似乎唯一有效的样式属性是 android:textAllCaps
和 android:textColor
- 其余的对我的 Button 没有影响。
由于您使用的是 MaterialTheme,因此您可以扩展 MaterialButton
:
class SelectableFlatButton(context: Context, attrs: AttributeSet? = null) :
MaterialButton(context, attrs, R.attr.selectableFlatButton)
然后定义默认属性样式:
<style name="AppTheme" parent="Theme.MaterialComponents.*">
<item name="selectableFlatButton">@style/SelectableFlatButton</item>
...
</style>
和:
<!-- Custom -->
<style name="FlatButton" parent="Widget.MaterialComponents.Button.UnelevatedButton">
<item name="elevation">0dp</item>
<item name="cornerRadius">0dp</item>
<item name="backgroundTint">@color/...</item>
<item name="rippleColor">@color/....</item>
<item name="android:textColor">@color/....</item>
<item name="android:insetTop">...</item>
<item name="android:insetBottom">...</item>
<item name="android:textAppearance">@style/MyTextAppearance.MaterialComponents</item>
<item name="android:selectable">true</item>
<item name="iconGravity">textStart</item>
<item name="iconTint">@color/....</item>
</style>
<style name="MyTextAppearance.MaterialComponents" parent="TextAppearance.MaterialComponents.Button">
<item name="android:textAllCaps">false</item>
</style>
<style name="SelectableFlatButton" parent="FlatButton">
<item name="backgroundTint">@color/...</item>
<item name="android:textColor">@color/...</item>
<item name="iconTint">@color/....</item>
</style>
在您的布局中使用:
<com.google.android.material.button.MaterialButton
app:icon="@drawable/...."
style="@style/SelectableFlatButton"
../>
<com.xxxx.SelectableFlatButton
app:icon="@drawable/..."
.../>
你有相同的结果。