android 芯片占用额外空间;无法包装

adi*_*adi 4 android android-layout android-chips material-components material-components-android

我使用带有动态芯片的芯片组。我希望芯片根据它们的文字被包裹在宽度上。但即使没有填充,它也需要额外的空间。

下面是我的代码:

xml:

<com.google.android.material.chip.ChipGroup
    android:id="@+id/cg"
    android:layout_width="0dp"
    android:layout_weight="75"
    android:layout_height="wrap_content"
    android:layout_marginTop="20dp"
    android:layout_marginBottom="5dp"
    android:textColor="@android:color/black"
    android:textStyle="bold"
    android:textSize="12sp"
    app:singleSelection="false"
    app:chipSpacingVertical="5dp"
    app:chipSpacingHorizontal="5dp"
    app:singleLine="false"
    app:chipSpacing="2dp">
Run Code Online (Sandbox Code Playgroud)

这是如何动态添加筹码:

for(int i=0;i<cartoonTypes.length;i++){
    chip = new Chip(this);
    chip.setText(cartoonTypes[i].trim());
    chip.setTextColor(Color.WHITE);
    chip.setChipBackgroundColor(getResources().getColorStateList(R.color.colorChip));
    chip.setTextSize(12);
    chip.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
    chip.setPadding(0,0,0,0);
    cgMovieGenre.addView(chip);
    ChipGroup.LayoutParams layoutParams = (ChipGroup.LayoutParams) chip.getLayoutParams();;
    int dpSize = px2dp(12);;
    layoutParams.height = dpSize;
    layoutParams.width = ChipGroup.LayoutParams.WRAP_CONTENT;
    chip.setLayoutParams(layoutParams);
}
Run Code Online (Sandbox Code Playgroud)

方法 px2dp 这样做:

int px2dp(int px){
    metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    int h = (px * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
    return h;
}
Run Code Online (Sandbox Code Playgroud)

build.gradle有以下依赖项:

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.cardview:cardview:1.0.0-beta01'
implementation 'com.google.android.material:material:1.0.0-beta01'
Run Code Online (Sandbox Code Playgroud)

这是我看到的:

截图,芯片组

我希望芯片根据其文本使用尽可能小的宽度。

Jia*_*aGu 5

您应该以正确的方式为芯片设置填充,试试这个:

chip.setChipStartPadding(0);
chip.setChipEndPadding(0);
Run Code Online (Sandbox Code Playgroud)


Gab*_*tti 5

只需在代码中删除这一行

//chip.setPadding(0,0,0,0);
Run Code Online (Sandbox Code Playgroud)

有和没有填充的结果:

在此输入图像描述
在此输入图像描述

只是为了了解里面的填充Chip

 * <pre>
 *   chipStartPadding     iconEndPadding     closeIconStartPadding         chipEndPadding
 *    +                    +                                    +                      +
 *    |                    |                                    |                      |
 *    |  iconStartPadding  |  textStartPadding   textEndPadding | closeIconEndPadding  |
 *    |   +                |    +                            +  |                  +   |
 *    |   |                |    |                            |  |                  |   |
 *    v   v                v    v                            v  v                  v   v
 * +-----+----+-----------+----+----+---------------------+----+----+----------+----+-----+
 * |     |    |       XX  |    |    |  XX   X  X  X  XXX  |    |    | X      X |    |     |
 * |     |    |      XX   |    |    | X  X  X  X  X  X  X |    |    |  XX  XX  |    |     |
 * |     |    |  XX XX    |    |    | X     XXXX  X  XXX  |    |    |    XX    |    |     |
 * |     |    |   XXX     |    |    | X  X  X  X  X  X    |    |    |  XX  XX  |    |     |
 * |     |    |    X      |    |    |  XX   X  X  X  X    |    |    | X      X |    |     |
 * +-----+----+-----------+----+----+---------------------+----+----+----------+----+-----+
 *                  ^                           ^                         ^
 *                  |                           |                         |
 *                  +                           +                         +
 *             chipIconSize                  *dynamic*              closeIconSize
 * </pre>
Run Code Online (Sandbox Code Playgroud)

还有一些注意事项:

  • chip.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL); 不起作用,因为芯片文本必须垂直居中并开始对齐
    芯片采用内置setGravity(Gravity.CENTER_VERTICAL | Gravity.START);

  • 而不是chip.setChipBackgroundColor(getResources().getColorStateList(R.color.colorChip));使用该方法chip.setChipBackgroundColorResource(R.color.colorChip)