Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is any difference between a MaterialButton and a simple Button?

If I set Theme.MaterialComponents.Light as my main theme, will be any difference between these two buttons if I use them in an xml layout?

<Button />

<com.google.android.material.button.MaterialButton />

As I saw they behave both as MaterialButtons. If I want to get the behavior of the old plain button, I have to use:

<androidx.appcompat.widget.AppCompatButton />

Thanks in advance!

like image 818
blade Avatar asked Sep 13 '19 14:09

blade


People also ask

What is MaterialButton?

A convenience class for creating a new Material button. This class supplies updated Material styles for the button in the constructor. The widget will display the correct default Material styles without the use of the style flag.

How do I add an icon to a material button?

There are free icons under New > Vector Assets on Android Studio. Set them as android:drawableLeft of the Button and you'll achieve something like your sample as well.

What is button discuss the working of Button with example?

Button is subclass of TextView class and CompoundButton is the subclass of Button class. There are different types of buttons in android such as RadioButton, ToggleButton, CompoundButton etc.


1 Answers

If you are using a MaterialComponents Theme there is no difference between <Button /> and <com.google.android.material.button.MaterialButton />.

There is an auto-inflation enabled which will replace <Button with <com.google.android.material.button.MaterialButton at runtime.

The MaterialComponentsViewInflater replaces some framework widgets with Material Components ones at inflation time, provided if a MaterialComponents theme is in use.
Something similar happens also with AppCompat (you can check that MaterialComponentsViewInflater extends AppCompatViewInflater).

It means that, the <Button is replaced <com.google.android.material.button.MaterialButton at runtime, if you are using a MaterialComponents Theme.

If I want to get the behavior of the old plain button, I have to use: <androidx.appcompat.widget.AppCompatButton />.

It is an option, but not necessarily.
It depends by what you want to achieve. You can also config a custom style since the Widget.MaterialComponents.Button style inherits by Widget.AppCompat.Button style.

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>
like image 76
Gabriele Mariotti Avatar answered Oct 07 '22 05:10

Gabriele Mariotti