【问题标题】:Is any difference between a MaterialButton and a simple Button?MaterialButton 和简单的 Button 有什么区别吗?
【发布时间】:2020-01-15 11:04:18
【问题描述】:
如果我将 Theme.MaterialComponents.Light 设置为我的主主题,如果我在 xml 布局中使用这两个按钮,它们之间会有什么区别吗?
<Button />
<com.google.android.material.button.MaterialButton />
正如我所见,它们的行为都是 MaterialButtons。
如果我想获得旧普通按钮的行为,我必须使用:
<androidx.appcompat.widget.AppCompatButton />
提前致谢!
【问题讨论】:
标签:
android
material-design
android-appcompat
android-button
material-components-android
【解决方案1】:
如果您使用的是MaterialComponents 主题,<Button /> 和<com.google.android.material.button.MaterialButton /> 之间没有区别。
启用了自动膨胀,它将在运行时将<Button替换为<com.google.android.material.button.MaterialButton。
MaterialComponentsViewInflater 在膨胀时将一些框架小部件替换为 Material Components 小部件,前提是在使用 MaterialComponents 主题时提供。
AppCompat 也会发生类似的情况(您可以查看 MaterialComponentsViewInflater extends AppCompatViewInflater)。
这意味着,如果您使用的是 MaterialComponents 主题,<Button 在运行时会被替换为 <com.google.android.material.button.MaterialButton。
如果我想获得旧的普通按钮的行为,我必须使用:
<androidx.appcompat.widget.AppCompatButton />.
这是一种选择,但不一定。
这取决于你想要达到的目标。您还可以配置自定义样式,因为Widget.MaterialComponents.Button 样式继承自Widget.AppCompat.Button 样式。
It is the difference:
<style name="Widget.MaterialComponents.Button" parent="Widget.AppCompat.Button">
<item name="enforceMaterialTheme">true</item>
<item name="enforceTextAppearance">true</item>
<item name="android:textAppearance">?attr/textAppearanceButton</item>
<item name="android:textColor">@color/mtrl_btn_text_color_selector</item>
<item name="android:paddingLeft">@dimen/mtrl_btn_padding_left</item>
<item name="android:paddingRight">@dimen/mtrl_btn_padding_right</item>
<item name="android:paddingTop">@dimen/mtrl_btn_padding_top</item>
<item name="android:paddingBottom">@dimen/mtrl_btn_padding_bottom</item>
<item name="android:insetLeft">0dp</item>
<item name="android:insetRight">0dp</item>
<item name="android:insetTop">@dimen/mtrl_btn_inset</item>
<item name="android:insetBottom">@dimen/mtrl_btn_inset</item>
<item name="android:stateListAnimator" ns2:ignore="NewApi">@animator/mtrl_btn_state_list_anim</item>
<item name="cornerRadius">@null</item>
<item name="elevation">@dimen/mtrl_btn_elevation</item>
<item name="iconPadding">@dimen/mtrl_btn_icon_padding</item>
<item name="iconTint">@color/mtrl_btn_text_color_selector</item>
<item name="rippleColor">@color/mtrl_btn_ripple_color</item>
<item name="backgroundTint">@color/mtrl_btn_bg_color_selector</item>
<item name="shapeAppearance">?attr/shapeAppearanceSmallComponent</item>
</style>