android 筹码占用额外空间;无法换行
android chips taking extra spaces;unable to wrap
我使用带有动态芯片的芯片组。我希望芯片根据其文本以宽度包裹。但是即使没有填充也需要额外的空间。
下面是我的代码:
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">
这是动态添加筹码的方法:
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);
}
方法 px2dp 这样做:
int px2dp(int px){
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int h = (px * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
return h;
}
我的 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'
这是我看到的:
我希望芯片根据其文本使用尽可能小的宽度。
你应该以正确的方式为芯片设置填充,试试这个:
chip.setChipStartPadding(0);
chip.setChipEndPadding(0);
对于芯片,不是(内部)"padding",而是(外部)"spacing":
app:chipSpacing
— 为水平轴和垂直轴添加间距。
app:chipSpacingHorizontal
— 增加水平轴间距。
app:chipSpacingVertical
— 向垂直轴添加间距。
与 line-wrapping 的最小间距为:
app:singleLine="false"
app:chipSpacing="0dp"
或者,将 ChipGroup
包装在 HorizontalScrollView
和 app:singleLine="true"
中。
可能只是删除 chip.setTextSize() 可能会帮助您摆脱右边的 space (但是,我仍然想知道如何更改字体大小)。
如果没有,这是我在项目中使用的解决方案:
- 为您的筹码定义样式:
<style name="ListChip" parent="Widget.MaterialComponents.Chip.Entry" >
<style name="ListChip" parent="Widget.MaterialComponents.Chip.Entry" >
<item name="rippleColor">@null</item>
<item name="closeIcon">@null</item>
<item name="chipBackgroundColor">?attr/background_highlight_color</item>
<item name="android:checkable">false</item>
<item name="android:textSize">8sp</item> //This has not effect
<item name="android:textColor">?attr/text_color</item>
</style>
- 使用根元素com.google.android.material.chip.Chip创建布局资源文件并应用新创建的样式:
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.chip.Chip
style="@style/ListChip"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:ellipsize="end">
</com.google.android.material.chip.Chip>
- 在代码中,不是通过使用 Chip chip = new Chip(this); 而是通过膨胀新创建的芯片布局来创建芯片:
Chip chip = (Chip) LayoutInflater.from(chipGroup.getContext()).inflate(R.layout.chip_in_list, chipGroup, false);
- 不要在新创建的芯片上调用chip.setTextSize()
只需 删除 代码中的这一行
//chip.setPadding(0,0,0,0);
带和不带填充的结果:
只是为了理解padding里面的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>
还有一些注意事项:
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)
首先,创建你的 attr (values/attrs.xml):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ChipView">
<attr name="CustomChipStyle" format="reference"/>
</declare-styleable>
</resources>
然后添加到您的主题
将您的 R.attr.CustomChipChoiceStyle 设置为您的主题 (values/styles.xml) 示例:
<style name="APPTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="colorPrimary">@color/primaryColor</item>
<item name="colorPrimaryDark">@color/primaryColor</item>
<item name="colorAccent">@color/secondaryColor</item>
<item name="CustomChipChoiceStyle">@style/ChipTextAppearance</item>
</style>
<style name="ChipTextAppearance" parent="@style/Widget.MaterialComponents.Chip.Choice">
<item name="android:minWidth">130dp</item>
<item name="chipMinHeight">50dp</item>
<item name="android:textAlignment">center</item>
</style>
如果你有这样的芯片组:
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:singleSelection="true"/>
您可以从代码中添加类似这样的内容:
val list = listOf("credit", "cash")
list.forEach{
val chip = Chip(context, null, R.attr.CustomChipStyle).apply {
text = it
}
chipGroup.addView(chip)
}
就是这样。
我正在以编程方式创建芯片,所以我必须在 kotlin 中执行此操作:
chip.minimumWidth = 0
chip.setEnsureMinTouchTargetSize(false)
我使用带有动态芯片的芯片组。我希望芯片根据其文本以宽度包裹。但是即使没有填充也需要额外的空间。
下面是我的代码:
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">
这是动态添加筹码的方法:
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);
}
方法 px2dp 这样做:
int px2dp(int px){
metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int h = (px * metrics.densityDpi) / DisplayMetrics.DENSITY_DEFAULT;
return h;
}
我的 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'
这是我看到的:
我希望芯片根据其文本使用尽可能小的宽度。
你应该以正确的方式为芯片设置填充,试试这个:
chip.setChipStartPadding(0);
chip.setChipEndPadding(0);
对于芯片,不是(内部)"padding",而是(外部)"spacing":
app:chipSpacing
— 为水平轴和垂直轴添加间距。app:chipSpacingHorizontal
— 增加水平轴间距。app:chipSpacingVertical
— 向垂直轴添加间距。
与 line-wrapping 的最小间距为:
app:singleLine="false"
app:chipSpacing="0dp"
或者,将 ChipGroup
包装在 HorizontalScrollView
和 app:singleLine="true"
中。
可能只是删除 chip.setTextSize() 可能会帮助您摆脱右边的 space (但是,我仍然想知道如何更改字体大小)。 如果没有,这是我在项目中使用的解决方案:
- 为您的筹码定义样式:
<style name="ListChip" parent="Widget.MaterialComponents.Chip.Entry" >
<style name="ListChip" parent="Widget.MaterialComponents.Chip.Entry" >
<item name="rippleColor">@null</item>
<item name="closeIcon">@null</item>
<item name="chipBackgroundColor">?attr/background_highlight_color</item>
<item name="android:checkable">false</item>
<item name="android:textSize">8sp</item> //This has not effect
<item name="android:textColor">?attr/text_color</item>
</style>
- 使用根元素com.google.android.material.chip.Chip创建布局资源文件并应用新创建的样式:
<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.chip.Chip
style="@style/ListChip"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:ellipsize="end">
</com.google.android.material.chip.Chip>
- 在代码中,不是通过使用 Chip chip = new Chip(this); 而是通过膨胀新创建的芯片布局来创建芯片:
Chip chip = (Chip) LayoutInflater.from(chipGroup.getContext()).inflate(R.layout.chip_in_list, chipGroup, false);
- 不要在新创建的芯片上调用chip.setTextSize()
只需 删除 代码中的这一行
//chip.setPadding(0,0,0,0);
带和不带填充的结果:
只是为了理解padding里面的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>
还有一些注意事项:
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)
首先,创建你的 attr (values/attrs.xml):
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ChipView">
<attr name="CustomChipStyle" format="reference"/>
</declare-styleable>
</resources>
然后添加到您的主题 将您的 R.attr.CustomChipChoiceStyle 设置为您的主题 (values/styles.xml) 示例:
<style name="APPTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="colorPrimary">@color/primaryColor</item>
<item name="colorPrimaryDark">@color/primaryColor</item>
<item name="colorAccent">@color/secondaryColor</item>
<item name="CustomChipChoiceStyle">@style/ChipTextAppearance</item>
</style>
<style name="ChipTextAppearance" parent="@style/Widget.MaterialComponents.Chip.Choice">
<item name="android:minWidth">130dp</item>
<item name="chipMinHeight">50dp</item>
<item name="android:textAlignment">center</item>
</style>
如果你有这样的芯片组:
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:singleSelection="true"/>
您可以从代码中添加类似这样的内容:
val list = listOf("credit", "cash")
list.forEach{
val chip = Chip(context, null, R.attr.CustomChipStyle).apply {
text = it
}
chipGroup.addView(chip)
}
就是这样。
我正在以编程方式创建芯片,所以我必须在 kotlin 中执行此操作:
chip.minimumWidth = 0
chip.setEnsureMinTouchTargetSize(false)