Почему текст кнопки не отображается в центре по умолчанию в MaterialComponents?

Когда я использовал AppCompat, все работало нормально, но когда я перешел на MaterialComponents, все стало плохо.

Смотрите текущее изображение:

логотип

Обратите внимание на «W», он отображается неправильно. для 'H' Тоже такая же проблема.

Примечание. Я пробовал использовать Button, AndroidXbutton и MaterialButton, в случае с MateriaComponents ничего не работает.

Код:

<androidx.cardview.widget.CardView
            android:id="@+id/circle_card_payment"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:elevation="12dp"
            android:innerRadius="0dp"
            android:shape="ring"
            android:thicknessRatio="1.9"
            app:cardCornerRadius="20dp">

            <ImageView
                android:id="@+id/icon"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:visibility="gone"></ImageView>

            <com.google.android.material.button.MaterialButton
                android:id="@+id/logo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:text="A"
                android:textColor="@color/colorWhite"
                android:textSize="16sp"
                android:visibility="gone"></com.google.android.material.button.MaterialButton>


        </androidx.cardview.widget.CardView>

Я устанавливаю программно рисуемый фон, потому что в материальных компонентах он не влияет на XML.

logo.setBackgroundResource(R.drawable.bg_circle_btn);

bg_circle_btn.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <solid android:color="?attr/toolbar_color" />

    <size
        android:width="120dp"
        android:height="120dp" />
</shape>

Обратите внимание, если я изменю размер карты с 40dp на 50dp, эта проблема будет решена, но размер будет больше, что выглядит плохо.

Полный XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/cardbackgroundColor"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp">


        <androidx.cardview.widget.CardView
            android:id="@+id/circle_card_payment"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:elevation="12dp"
            android:innerRadius="0dp"
            android:shape="ring"
            android:thicknessRatio="1.9"
            app:cardCornerRadius="20dp">

            <ImageView
                android:id="@+id/icon"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:visibility="gone"></ImageView>

            <com.google.android.material.button.MaterialButton
                android:id="@+id/logo"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true"
                android:text="A"
                android:textColor="@color/colorWhite"
                android:textSize="16sp"
                android:visibility="gone"></com.google.android.material.button.MaterialButton>


        </androidx.cardview.widget.CardView>

        <TextView
            android:id="@+id/tv_category_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="12dp"
            android:layout_toLeftOf="@+id/next"
            android:layout_toRightOf="@+id/circle_card_payment"
            android:text="Category"
            android:textColor="?attr/day_colorDarkGray_night_colorWhite"
            android:textSize="16sp" />


        <ImageView
            android:id="@+id/next"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_alignParentEnd="true"
            android:layout_centerVertical="true"
            android:padding="6dp"
            android:tint="@color/colorVeryLightGray"
            android:visibility="visible"
            app:srcCompat="@drawable/ic_navigate_next_black_24dp" />


        <ImageView
            android:id="@+id/hamburger_menu"
            android:layout_width="40dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@+id/next"
            android:padding="6dp"
            android:tint="?attr/day_colorBlack_night_colorWhite"
            android:visibility="gone"
            app:srcCompat="@drawable/ic_more_vert_black_24dp" />
    </RelativeLayout>

    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginLeft="70dp"
        android:background="@color/colorVeryLightGray" />


</LinearLayout>

person Priyanka Singh    schedule 09.10.2019    source источник
comment
Проверьте свой логкэт. Вы должны найти: W/MaterialButton: Do not set the background; MaterialButton manages its own background drawable.   -  person Gabriele Mariotti    schedule 09.10.2019
comment
@Prianka, вы должны пометить ответ как принятый там. stackoverflow.com/questions/58301863 /   -  person Md. Asaduzzaman    schedule 09.10.2019
comment
@GabrieleMariotti, но я хочу использовать свой собственный фон для рисования. Что я должен делать?   -  person Priyanka Singh    schedule 09.10.2019
comment
@Md.Asaduzzaman А как насчет моего решения? Я все еще пытаюсь, дорогая.   -  person Priyanka Singh    schedule 09.10.2019
comment
Я знаю, но проверьте свой вопрос, два вопроса разные, и решение тоже должно быть другим. принять одно, а затем спросить другое. Это будет мотивировать других помогать вам. Спасибо   -  person Md. Asaduzzaman    schedule 09.10.2019
comment
@Md.Asaduzzaman Хорошо, я буду. но прямо сейчас просто помогите мне с ответом ниже. Я пробовал, работает. но когда я использую это внутри любого макета. такая же проблема бывает.   -  person Priyanka Singh    schedule 09.10.2019


Ответы (1)


В MaterialButton вы не должны использовать методы setBackground*.
Вы можете проверить logcat, вы должны найти что-то вроде:

W/MaterialButton: Do not set the background; MaterialButton manages its own background drawable

Вместо этого в MaterialButton вы можете определить нестандартная форма по-разному. Например, вы можете сделать:

<com.google.android.material.button.MaterialButton
            android:id="@+id/logo"
            android:layout_width="48dp"
            android:layout_height="48dp"
            android:text="W"
            android:padding="0dp"
            app:strokeWidth="0dp"
            android:insetLeft="0dp"
            android:insetTop="0dp"
            android:insetRight="0dp"
            android:insetBottom="0dp"
            android:textColor="#FFFFFF"
            android:textSize="16sp"
            app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay_ButtonCircle50"
            />

где ShapeAppearanceOverlay_ButtonCircle50 определяется:

  <style name="ShapeAppearanceOverlay_ButtonCircle50">
    <item name="cornerFamily">rounded</item>
    <item name="cornerSize">50%</item>
  </style>

введите здесь описание изображения

person Gabriele Mariotti    schedule 09.10.2019
comment
Последняя просьба. Не могли бы вы настроить меня внутри карты? потому что я устанавливаю текст android:layout_toRightOf=@+id/circle_card_payment справа от карты. И в карточке у меня есть изображение и кнопка этого материала. - person Priyanka Singh; 09.10.2019
comment
И в чем проблема? - person Gabriele Mariotti; 09.10.2019
comment
когда я использую эту кнопку внутри относительного макета, это дает ту же проблему. - person Priyanka Singh; 09.10.2019
comment
Если вы внимательно посмотрите на скриншот и завершите XML, я установил название категории справа от этой карты. Теперь предположим, что я удаляю карточку, тогда мне нужно сделать любой другой макет, например относительный макет, чтобы я мог сделать android:layout_toRightOf=@+id/circle_card_payment, но из-за относительной ширины макета, которая должна быть 40, снова он дает то же самое проблема. - person Priyanka Singh; 09.10.2019
comment
Я думаю, что это отдельная проблема. Возможно, вы захотите задать отдельный вопрос. - person Gabriele Mariotti; 09.10.2019