android - 为什么 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>
请注意,如果我将 cardview 尺寸从 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>
解决方案
在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>
推荐阅读
- javascript - jquery图像交换的淡入淡出过渡
- html - 指定的值“07/24/2020”不符合要求的格式“yyyy-MM-dd”。有角度的
- r - 我想复制这张图表,显示公司如何随着时间的推移改变五分位数
- python - Pytorch gpu 使用率低
- ruby - 动态常量赋值 main.rb:6: Ruby
- node.js - 如何在 forEach 中附加来自另一个数组的数据?
- android - 防止AlarmManager颤振插件在播放声音时不受Doze模式的影响
- python - Python:将(否则)未定义的名称绑定到对象
- python - Python - 如何返回特定行
- python - Python quit() 函数返回错误。我正在使用 spyder 4.1.2