我正在用Chips做一份清单。我希望可以选择此筹码,因此,看看https://material.io/develop/android/components/chip/,我可以看到一个“选择筹码”。
由于需要创建和添加动态图片,因此必须配置特定的颜色,颜色波纹,...
所以我要配置的是:
val chip = Chip(context, null, R.style.CustomChipChoice)
chip.isClickable = true
chip.isCheckable = true
chip.isCheckedIconVisible=false
chip.height = ScreenUtils.dpToPx(40)
chip.chipCornerRadius = (ScreenUtils.dpToPx(20)).toFloat()
chip.chipStrokeWidth = (ScreenUtils.dpToPx(2)).toFloat()
chip.setTextAppearanceResource(R.style.ChipTextStyle)
return chip
我尝试使用R.style.CustomChipChoice
的是:
CustomChipChoice样式
<style name="CustomChipChoice" parent="@style/Widget.MaterialComponents.Chip.Choice">
<item name="chipBackgroundColor">@color/background_color_chip_state_list</item>
<item name="chipStrokeColor">@color/background_color_chip_state_list</item>
<item name="rippleColor">@color/topic_social_pressed</item>
</style>
background_color_chip_state_list
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/topic_social_selected" android:state_checked="true" />
<item android:color="@color/topic_social_pressed" android:state_pressed="true" />
<item android:color="@color/topic_unselected_background" />
</selector>
stroke_color_chip_state_list
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/topic_social_pressed" android:state_checked="true"/>
<item android:color="@color/grey_material2" android:state_checked="false"/>
</selector>
如您所见,我将芯片制作为可点击且可检查的(隐藏不需要的选中图标)。
但是当我测试它时,没有设置颜色。芯片看起来只是默认的颜色(灰度)
此自定义样式可以在哪里应用或如何应用?
PS:
我已经进行了快速测试,以查看我的CustomStyle是否格式错误/等。
我通过xml添加了一个视图,并且运行良好...
<android.support.design.chip.Chip
android:id="@+id/test"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/CustomChipChoice"
android:checkable="true"
android:clickable="true"
app:checkedIconVisible="false"
android:text="Chip Test"/>
答案 0 :(得分:4)
您不能使用构造函数val chip = Chip(context, null, R.style.CustomChipChoice)
,因为第3 参数不是样式,而是主题中的属性R.attr.chipStyle
。
Chip
没有像其他组件一样具有4个参数的构造函数,因为它扩展了AppCompatCheckbox
,它不支持4个参数的构造函数。
但是您可以使用其他内容。
第一个选项:
只需使用 xml布局(single_chip_layout.xml
)即可使用您的最喜欢的样式来定义单个Chip
:
<com.google.android.material.chip.Chip
xmlns:android="http://schemas.android.com/apk/res/android"
style="@style/CustomChipChoice"
...
/>
使用
<style name="CustomChipChoice" parent="@style/Widget.MaterialComponents.Chip.Choice">
...
</style>
然后代替val chip = Chip(context, null, R.style.CustomChipChoice)
使用:
val chip = layoutInflater.inflate(R.layout.single_chip_layout, chipGroup, false) as Chip
在Java中:
Chip chip =
(Chip) getLayoutInflater().inflate(R.layout.single_chip_layout, chipGroup, false);
第二个选项:
另一种选择是使用setChipDrawable
方法覆盖ChipDrawable
内部的Chip
:
Chip chip = new Chip(this);
ChipDrawable chipDrawable = ChipDrawable.createFromAttributes(this,
null,
0,
R.style.Widget_MaterialComponents_Chip_Choice);
chip.setChipDrawable(chipDrawable);
答案 1 :(得分:0)
要在代码中设置芯片样式,您可以尝试以下操作:
val chip = Chip(context)
val drawable = ChipDrawable.createFromAttributes(context, null, 0, R.style.Widget_MaterialComponents_Chip_Choice)
chip.setChipDrawable(drawable)
答案 2 :(得分:0)
CustomChipChoice
不是样式,它只是对样式的引用。因此将R.style.CustomChipChoice
更改为R.attr.CustomChipChoice
val newChip = Chip(context, null, R.attr.CustomChipChoice)
,但是在此之前,您应该在项目中的CustomChipChoice
文件中添加此values.xml
。
为了这。如果您的项目没有values.xml
在values
目录中创建。
然后添加CustomChipChoice
。
values.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="CustomChipChoice" format="reference" />
</resources>
现在styles.xml
中添加您的样式。
styles.xml
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
.
.
<item name="CustomChipChoice">@style/CustomChipChoiceStyle</item>
.
.
</style>
现在CustomChipChoice
attr引用了这种样式
现在您可以在styles.xml
文件中创建自定义样式了。
styles.xml
<style name="CustomChipChoiceStyle" parent="@style/Widget.MaterialComponents.Chip.Action">
.
<item name="checkedIconVisible">false</item>
<item name="android:focusable">true</item>
<item name="android:clickable">true</item>
<item name="chipBackgroundColor">@color/colorWhite</item>
<item name="chipIcon">@drawable/ic_filter</item>
<item name="chipIconVisible">true</item>
<item name="textStartPadding">0dp</item>
<item name="textEndPadding">0dp</item>
.
.
<item name="android:textAppearance">@style/ChipTextStyleAppearance</item>
</style>
如果要更改芯片的文本外观。这里是ChipTextStyleAppearance
。您可以像这样添加它。
styles.xml
<style name="ChipTextStyleAppearance">
<item name="android:fontFamily">@font/main_font</item>
<item name="android:textSize">13dp</item>
<item name="android:textColor">#ffffff</item>
</style>
不要忘记在AppTheme
或androidManifest.xml
标签上的application
中添加activity
。
androidManifest.xml
<application
.
.
android:theme="@style/AppTheme">
<activity
.
.
android:theme="@style/AppTheme" />
答案 3 :(得分:0)
xml
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
</com.google.android.material.chip.ChipGroup>
类
data class Parametro(
var idParametro: Long,
var nombreParametro: String? )
主要
listParametro.forEach { it->
val chip = Chip(context)
chip.id= it.idParametro.toInt()
chip.text= it.nombreParametro
chip.isClickable = true
chip.isCheckable = true
chip.setOnCheckedChangeListener { buttonView, isChecked ->
Log.i("checkedChipIds","${buttonView.id} $isChecked")
}
mBinding.chipGroup.addView(chip)
}
它对我有用:)