如何在 Android 上以编程方式更改 Material 组件的颜色?
How to change color in Material Components PROGRAMMATICALLY on Android?
我正在寻找一种解决方案来更改某些 Android Material 组件布局对象的颜色。 如何以编程方式更改 Material 按钮中文本或边框的颜色? MaterialButton.setTexColor()
等所有功能都不起作用。 StrokeColor 也一样。更改必须从逻辑上直接从代码中进行。 没有 XML 样式,颜色必须能够根据从数据库中读取的值实时更改。
像这样的东西不起作用:
//renewSetDate is a Material Button Object
renewSetDate.strokeColor = ColorStateList.valueOf(Color.RED)
renewSetDate.setTextColor(Color.WHITE)
这是 Material 按钮的 XML 布局
<com.google.android.material.button.MaterialButton
android:id="@+id/addSubs_btnSet_date"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="15dp"
android:text="Imposta data di rinnovo abbonamento"
android:textAlignment="center"
android:textColor="#FFFFFF"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/addSubs_detailTitle"
app:strokeColor="@color/colorAccent" />
必须从保存在数据库中的模板中读取颜色。我无法为每个模板创建 XML 样式。
我发现必须仅通过谁知道 XML 模板中的哪些属性来更改布局颜色真的很烦人。
这些是依赖关系
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0-rc01'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
你可以这样定义颜色:
//From RGB
int colorRGB = Color.rgb(255,0,0);
//From HEX String
int colorHEX = Color.parseColor("#FF11AA");
然后要在 MaterialButton 中定义边框颜色,您可以使用 setStrokeColor
方法。
int[][] states = new int[][] {
new int[] { android.R.attr.state_checked}, // checked
new int[] { -android.R.attr.state_checked} // checked false
};
int[] colors = new int[] {
colorRGB,
colorHEX
};
ColorStateList myColorSelector = new ColorStateList(states, colors);
button.setStrokeColor(myColorSelector);
对于文本颜色,您可以使用与setTextColor
方法类似的方法。
您的选择器应处理这些状态:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="1.00" android:color="?attr/colorPrimary" android:state_checkable="true" android:state_checked="true" android:state_enabled="true"/>
<item android:alpha="0.60" android:color="?attr/colorOnSurface" android:state_checkable="true" android:state_checked="false" android:state_enabled="true"/>
<item android:alpha="1.00" android:color="?attr/colorPrimary" android:state_enabled="true"/>
<item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
</selector>
类似于:
int[][] states = new int[][]{
new int[]{android.R.attr.state_checkable,android.R.attr.state_checked,android.R.attr.state_enabled},
new int[]{android.R.attr.state_checkable,-android.R.attr.state_checked,android.R.attr.state_enabled},
new int[]{android.R.attr.state_enabled},
new int[]{}
};
不确定是否已完全回答。
我遇到了同样的问题,最后我做了:
button.strokeColor = ColorStateList.valueOf(Color.RED)
button.strokeWidth = 1
这对我有用。
我正在使用 MaterilButton 和 Kotlin,我会写一些你可以使用的选项:
binding.buttonCancelRequest.isClickable=false
binding.buttonCancelRequest.background.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY)
binding.buttonCancelRequest.strokeColor= ColorStateList.valueOf(Color.GRAY)
我正在寻找一种解决方案来更改某些 Android Material 组件布局对象的颜色。 如何以编程方式更改 Material 按钮中文本或边框的颜色? MaterialButton.setTexColor()
等所有功能都不起作用。 StrokeColor 也一样。更改必须从逻辑上直接从代码中进行。 没有 XML 样式,颜色必须能够根据从数据库中读取的值实时更改。
像这样的东西不起作用:
//renewSetDate is a Material Button Object
renewSetDate.strokeColor = ColorStateList.valueOf(Color.RED)
renewSetDate.setTextColor(Color.WHITE)
这是 Material 按钮的 XML 布局
<com.google.android.material.button.MaterialButton
android:id="@+id/addSubs_btnSet_date"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="15dp"
android:layout_marginTop="10dp"
android:layout_marginEnd="15dp"
android:text="Imposta data di rinnovo abbonamento"
android:textAlignment="center"
android:textColor="#FFFFFF"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/addSubs_detailTitle"
app:strokeColor="@color/colorAccent" />
必须从保存在数据库中的模板中读取颜色。我无法为每个模板创建 XML 样式。
我发现必须仅通过谁知道 XML 模板中的哪些属性来更改布局颜色真的很烦人。
这些是依赖关系
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'androidx.cardview:cardview:1.0.0'
implementation 'androidx.viewpager2:viewpager2:1.0.0-rc01'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.material:material:1.0.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
你可以这样定义颜色:
//From RGB
int colorRGB = Color.rgb(255,0,0);
//From HEX String
int colorHEX = Color.parseColor("#FF11AA");
然后要在 MaterialButton 中定义边框颜色,您可以使用 setStrokeColor
方法。
int[][] states = new int[][] {
new int[] { android.R.attr.state_checked}, // checked
new int[] { -android.R.attr.state_checked} // checked false
};
int[] colors = new int[] {
colorRGB,
colorHEX
};
ColorStateList myColorSelector = new ColorStateList(states, colors);
button.setStrokeColor(myColorSelector);
对于文本颜色,您可以使用与setTextColor
方法类似的方法。
您的选择器应处理这些状态:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:alpha="1.00" android:color="?attr/colorPrimary" android:state_checkable="true" android:state_checked="true" android:state_enabled="true"/>
<item android:alpha="0.60" android:color="?attr/colorOnSurface" android:state_checkable="true" android:state_checked="false" android:state_enabled="true"/>
<item android:alpha="1.00" android:color="?attr/colorPrimary" android:state_enabled="true"/>
<item android:alpha="0.38" android:color="?attr/colorOnSurface"/>
</selector>
类似于:
int[][] states = new int[][]{
new int[]{android.R.attr.state_checkable,android.R.attr.state_checked,android.R.attr.state_enabled},
new int[]{android.R.attr.state_checkable,-android.R.attr.state_checked,android.R.attr.state_enabled},
new int[]{android.R.attr.state_enabled},
new int[]{}
};
不确定是否已完全回答。
我遇到了同样的问题,最后我做了:
button.strokeColor = ColorStateList.valueOf(Color.RED)
button.strokeWidth = 1
这对我有用。
我正在使用 MaterilButton 和 Kotlin,我会写一些你可以使用的选项:
binding.buttonCancelRequest.isClickable=false
binding.buttonCancelRequest.background.setColorFilter(Color.GRAY,PorterDuff.Mode.MULTIPLY)
binding.buttonCancelRequest.strokeColor= ColorStateList.valueOf(Color.GRAY)