Java 如何使文本视图具有完全圆形的背景,无论文本显示的长度如何

Java 如何使文本视图具有完全圆形的背景,无论文本显示的长度如何,java,android,layout,textview,Java,Android,Layout,Textview,我试图制作一个通知计数指示器,其中TextView将显示当前通知的数量。文本视图将放置在带有钟形图标的ImageView的顶部。问题是,当我使用可绘制的资源设置TextView的背景时,我得到了一个数字较小的圆形,比如1。但是当文本视图中显示较大的数字时,它将不再是圆形。我如何使TextView具有带彩色背景的圆形,而不管文本及其长度如何 当它显示数字“1”时,它几乎是圆形的 但是当我把数字“99”放在一起时,它只有圆形的边。它不是完全圆的 这是我用于TextView的可绘制资源的代码: &

我试图制作一个通知计数指示器,其中
TextView
将显示当前通知的数量。文本视图将放置在带有钟形图标的
ImageView
的顶部。问题是,当我使用可绘制的资源设置TextView的背景时,我得到了一个数字较小的圆形,比如1。但是当文本视图中显示较大的数字时,它将不再是圆形。我如何使TextView具有带彩色背景的圆形,而不管文本及其长度如何

当它显示数字“1”时,它几乎是圆形的

但是当我把数字“99”放在一起时,它只有圆形的边。它不是完全圆的

这是我用于TextView的可绘制资源的代码:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <solid android:color="#FF173C" />

    <size android:height="10dp" android:width="10dp"/>
    <corners
        android:bottomLeftRadius="2000dp"
        android:bottomRightRadius="2000dp"
        android:topLeftRadius="2000dp"
        android:topRightRadius="2000dp" />

    <padding android:right="5dp" android:left="5dp"/>

</shape>

然后我在TextView中使用它,如下所示:

  <TextView
     android:id="@+id/notification_count"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="1"
     android:background="@drawable/bg_notification"
     android:textColor="@android:color/white"
     app:layout_constraintStart_toStartOf="parent"
     app:layout_constraintTop_toTopOf="parent" />

您可以向文本视图本身添加填充,这样文本就不会扭曲整体视图

<TextView
            android:id="@+id/notification_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="181"
            android:background="@drawable/bg_notification"
            android:textColor="@android:color/white"
            android:padding="8dp" />

将形状XML更改为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <size
        android:width="32dp"
        android:height="32dp" />

    <solid android:color="#FF173C" />

</shape>


那应该行

您可以向文本视图本身添加填充,这样文本就不会扭曲整体视图

<TextView
            android:id="@+id/notification_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="181"
            android:background="@drawable/bg_notification"
            android:textColor="@android:color/white"
            android:padding="8dp" />

将形状XML更改为:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <size
        android:width="32dp"
        android:height="32dp" />

    <solid android:color="#FF173C" />

</shape>


那应该行

徽章通常不超过99个,许多大型应用程序也会这样做,因此请尝试手动调整它们的大小

<TextView
 ...
 android:layout_width="35dp"
 android:layout_height="35dp"
 android:text="99"
 ...
  />

徽章通常不超过99个,许多大型应用程序也会这样做,因此尝试手动调整大小

<TextView
 ...
 android:layout_width="35dp"
 android:layout_height="35dp"
 android:text="99"
 ...
  />

您可以使用
app:layout\u constraintDimensionRatio=“1”包装
文本视图的内容,并约束其宽度,使其与宽度相等。

但是当文本较短(1个字符)时,会出现一个问题,因为现在的宽度较短;因此,文本的一部分将被隐藏,您可以通过分别使用
app:layout\u constraintWidth\u min
&
app:layout\u constraintheighth\u min
约束最小宽度/高度来修复此问题

<TextView
    android:id="@+id/notification_count"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/bg_notification"
    android:gravity="center"
    android:padding="8dp"
    android:text="3"
    app:layout_constraintWidth_min="40dp"
    app:layout_constraintHeight_min="40dp"
    app:layout_constraintDimensionRatio="1"
    android:textColor="@android:color/white"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"  />

预览:


您可以使用
app:layout\u constraintDimensionRatio=“1”将
文本视图的内容包装成宽度,并约束高度,使其与宽度相等。

但是当文本较短(1个字符)时,会出现一个问题,因为现在的宽度较短;因此,文本的一部分将被隐藏,您可以通过分别使用
app:layout\u constraintWidth\u min
&
app:layout\u constraintheighth\u min
约束最小宽度/高度来修复此问题

<TextView
    android:id="@+id/notification_count"
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:background="@drawable/bg_notification"
    android:gravity="center"
    android:padding="8dp"
    android:text="3"
    app:layout_constraintWidth_min="40dp"
    app:layout_constraintHeight_min="40dp"
    app:layout_constraintDimensionRatio="1"
    android:textColor="@android:color/white"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"  />

预览:


你能提供一些代码和截图吗?好的,给我一分钟。你能提供一些代码和截图吗?好的,给我一分钟。这不管用。我已经试过了你有没有试过去掉你形状上的填充物和尺寸?而且在文本视图中使用更大的填充值?是的,我已经尝试过了。如果它适用于一位数。我更新了我的答案,我在一个示例项目中试用过,它似乎在3位数之前都能正常工作,超过3位数,它看起来有点像一个椭圆形而不是圆形。如果你的值没有那么高,你可以使用它们,否则,你应该能够从这一点上调整一点。试试看!您还可以动态地将垂直填充增加到比水平填充高一点的位置,以补偿较大的值(这将使形状在水平方向上变宽,这就是扭曲形状的原因)。这不起作用。我已经试过了你有没有试过去掉你形状上的填充物和尺寸?而且在文本视图中使用更大的填充值?是的,我已经尝试过了。如果它适用于一位数。它对两个或三位数的数字不太好。我更新了我的答案,我在一个示例项目中尝试过,它似乎工作正常,直到3位数的值,在这个值之外,它看起来有点像椭圆形而不是圆。如果你的值没有那么高,你可以使用它们,否则,你应该能够从这一点上调整一点。试试看!您还可以动态地将垂直填充增加到比水平填充高一点的位置,以补偿较大的值(这将是双向水平宽度,这就是扭曲形状的原因)。额外的属性正是我所需要的。谢谢这些额外的属性正是我所需要的。谢谢