我已经查看了所有线程,但没有提供可行的答案。样式化NumberPicker不起作用(根据此主题:NumberPicker textColour)
将numberPicker上的style属性设置为具有颜色项的样式也没有任何效果。也没有在numberPicker XML上设置textColor属性做任何事情。
最近我得到的是使用numberPicker将其getChildAt()转换为EditText,然后对该EditText执行setColor(),但这只会在初始化时更改子颜色,然后每次更改从它上面选择的时间;不是我要找的东西。
有任何帮助吗?感谢
答案 0 :(得分:71)
此代码可以解决您的问题。您遇到的问题是因为在构造NumberPicker期间,它捕获EditText textColor并分配给一个绘画,以便它可以使用相同的颜色绘制编辑文本上方和下方的数字。
import java.lang.reflect.Field;
public static void setNumberPickerTextColor(NumberPicker numberPicker, int color)
{
try{
Field selectorWheelPaintField = numberPicker.getClass()
.getDeclaredField("mSelectorWheelPaint");
selectorWheelPaintField.setAccessible(true);
((Paint)selectorWheelPaintField.get(numberPicker)).setColor(color);
}
catch(NoSuchFieldException e){
Log.w("setNumberPickerTextColor", e);
}
catch(IllegalAccessException e){
Log.w("setNumberPickerTextColor", e);
}
catch(IllegalArgumentException e){
Log.w("setNumberPickerTextColor", e);
}
final int count = numberPicker.getChildCount();
for(int i = 0; i < count; i++){
View child = numberPicker.getChildAt(i);
if(child instanceof EditText)
((EditText)child).setTextColor(color);
}
numberPicker.invalidate();
}
答案 1 :(得分:52)
我为我努力的解决方案是:
在styles.xml中添加:
<style name="AppTheme.Picker" parent="Theme.AppCompat.Light.NoActionBar" >
<item name="android:textColorPrimary">@android:color/black</item>
</style>
然后在布局中使用它:
<NumberPicker
android:id="@+id/dialogPicker"
android:theme="@style/AppTheme.Picker"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="15dp" />
答案 2 :(得分:30)
不确定为什么需要深入研究Java Reflection API。它是一个简单的造型问题。您需要覆盖的属性是:textColorPrimary
。
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
....
<item name="android:textColorPrimary">#ff0000</item>
</style>
如果您在TimePicker
内使用Dialog
,请在对话框的主题中覆盖android:textColorPrimary
。
就是这样。
其他信息:
以下是Yoann Hercouet的深刻见解:
此解决方案不会仅更改NumberPicker上的颜色 是一个全球变化,将影响很多组件
这是正确的,但它忽略了我暗示的可能性。此外,global
意味着应用范围的影响。通过仅将此主题应用于包含NumberPicker
的活动,可以将其限制为活动范围。但是,我同意,这可能仍然是腐蚀性的。
这里的想法是以某种方式将textColorPrimary=INTENDED_COLOR
注入NumberPicker
将要看到的主题中。有多种方法可以实现这一目标。这是一种方式:
在res/values/styles.xml
中定义一个裸骨样式:
<style name="NumberPickerTextColorStyle">
<item name="android:textColorPrimary">@color/intended_color</item>
</style>
现在,创建一个自定义NumberPicker
:
public class ThemedNumberPicker extends NumberPicker {
public ThemedNumberPicker(Context context) {
this(context, null);
}
public ThemedNumberPicker(Context context, AttributeSet attrs) {
// wrap the current context in the style we defined before
super(new ContextThemeWrapper(context, R.style.NumberPickerTextColorStyle), attrs);
}
}
最后,在布局中使用ThemedNumberPicker
:
<package.name.ThemedNumberPicker
android:id="@+id/numberPicker"
....
....
.... />
我们已成功控制textColorPrimary=INTENDED_COLOR
对我们的应用产生的影响。
这当然只是一种选择。例如,如果您要对包含NumberPicker
的布局进行充气,则可以使用:
// In this case, the layout contains <NumberPicker... />, not <ThemedNumberPicker... />
LayoutInflater.from(new ContextThemeWrapper(context, R.style.NumberPickerTextColorStyle))
.inflate(R.layout.number_picker_layout, ...);
答案 3 :(得分:6)
以上是使用TextSize和TextStyle Bold的答案的Xamarin片段
public static bool SetNumberPickerTextColorAndSize(NumberPicker numberPicker, Color color, ComplexUnitType complexUnitType, float textSize, TypefaceStyle style)
{
int count = numberPicker.ChildCount;
for (int i = 0; i < count; i++)
{
View child = numberPicker.GetChildAt(i);
if (child.GetType() == typeof(EditText))
{
try
{
Field selectorWheelPaintField = numberPicker.Class
.GetDeclaredField("mSelectorWheelPaint");
selectorWheelPaintField.Accessible = true;
EditText editText = (EditText) child;
editText.SetTextSize(complexUnitType, textSize);
editText.SetTypeface(editText.Typeface, style);
editText.SetTextColor(color);
Paint paint = (Paint) selectorWheelPaintField.Get(numberPicker);
paint.TextSize = TypedValue.ApplyDimension(complexUnitType, textSize, numberPicker.Resources.DisplayMetrics);
paint.Color = color;
paint.SetTypeface(editText.Typeface);
numberPicker.Invalidate();
return true;
}
catch (NoSuchFieldException e)
{
Log.Warn("setNumberPickerTextColor", e);
}
catch (IllegalAccessException e)
{
Log.Warn("setNumberPickerTextColor", e);
}
catch (IllegalArgumentException e)
{
Log.Warn("setNumberPickerTextColor", e);
}
}
}
return false;
}
答案 4 :(得分:2)
我采用@Andreas Merz的解决方案并更新了他的代码。分配事物的方式和他使用的功能签名/调用都没有找到。我正在使用min API 19
。这是适用于我的代码。
/**
* Based on https://stackoverflow.com/a/26657169/2313889
* @param picker
* @param color
* @param unit
* @param textSize
* @param typeface
* @return
*/
private void formatNumberPickerText(NumberPicker picker, int color,
int unit, float textSize,
Typeface typeface) {
int count = picker.getChildCount();
for (int i = 0; i < count; i++) {
View child = picker.getChildAt(i);
if (child instanceof EditText) {
try {
Class clazz = picker.getClass();
Field field = clazz.getDeclaredField("mSelectorWheelPaint");
field.setAccessible(true);
EditText editText = (EditText) child;
editText.setTextSize(unit, textSize);
editText.setTypeface(typeface);
editText.setTextColor(color);
Paint paint = (Paint) field.get(picker);
paint.setTextSize(TypedValue.applyDimension(
unit, textSize, getResources().getDisplayMetrics()
));
paint.setColor(color);
paint.setTypeface(typeface);
picker.invalidate();
return;
} catch (IllegalAccessException | NoSuchFieldException e) {
e.printStackTrace();
}
}
}
}
答案 5 :(得分:1)
接受的答案过于复杂。一个更简单的方法对我有用,就是覆盖我正在使用的主题的textColorPrimary
属性。
<style name="Theme.MyTheme" parent="@android:style/Theme.Holo.NoActionBar.Fullscreen" >
<item name="android:textColorPrimary">#000000</item>
</style>
它做得很好!
答案 6 :(得分:1)
不要将每种文本颜色更改为您想要的颜色,而是更改所有editText颜色。 NumberPicker实际上有一个显示数字的子EditText。
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Change edit color here. -->
<item name="android:editTextColor">#000000</item>
</style>
这对我有用。虽然我在按钮中有白色文字,但它们没有改变。
答案 7 :(得分:0)
基于Android SDK上的反射拒绝> = 29更好地修改Simon的答案:
public void setNumberPickerTextColor(NumberPicker numberPicker, int color){
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) {
final int count = numberPicker.getChildCount();
for (int i = 0; i < count; i++) {
View child = numberPicker.getChildAt(i);
if (child instanceof EditText) {
try {
((EditText) child).setTextColor(color);
numberPicker.invalidate();
Field selectorWheelPaintField = numberPicker.getClass().getDeclaredField("mSelectorWheelPaint");
boolean accessible = selectorWheelPaintField.isAccessible();
selectorWheelPaintField.setAccessible(true);
((Paint) selectorWheelPaintField.get(numberPicker)).setColor(color);
selectorWheelPaintField.setAccessible(accessible);
numberPicker.invalidate();
Field selectionDividerField = numberPicker.getClass().getDeclaredField("mSelectionDivider");
accessible = selectionDividerField.isAccessible();
selectionDividerField.setAccessible(true);
selectionDividerField.set(numberPicker, null);
selectionDividerField.setAccessible(accessible);
numberPicker.invalidate();
} catch (Exception exception) {
Logger.exc(exception);
}
}
}
} else {
numberPicker.setTextColor(color);
}
}
在SDK中,> = 29 NumberPicker具有.setTextColor()方法。
答案 8 :(得分:0)
对于我来说,在主题中设置android:textColorPrimary
并没有任何作用,而是查看NumberPicker
的源代码,它决定了EditText
输入的文本颜色,因此需要设置{{ 1}}。
android:editTextColor
答案 9 :(得分:-1)
使用我的NumberPicker library很容易。
<com.github.tomeees.scrollpicker.ScrollPicker
...
app:textColor="..."
/>