[Android] NumberPicker选择项目更改颜色

时间:2015-12-17 13:56:33

标签: android

是否可以在numberpicker中更改所选项目的颜色,以便每次出现一个新的中心子TextView时,将其颜色更改为我喜欢的颜色,我没有找到任何关于此的样式或API?

4 个答案:

答案 0 :(得分:2)

您可以尝试使用以下代码。只需在此参数中传递您的NumberPicker和颜色。希望这能解决您的问题

import java.lang.reflect.Field;

public static void changeNumberPickerTextColor(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 :(得分:2)

根据设计,不能仅更改中心颜色。如果检查NumberPicker的源代码(特别是在 onDraw 方法中),则将看到在渲染时该小部件在中心项目和其余项目之间没有区别。所有文本均使用相同的颜色呈现。

源代码链接。从注释“ //绘制选择器轮 ”开始检查onDraw方法:https://android.googlesource.com/platform/frameworks/base/+/0e2d281/core/java/android/widget/NumberPicker.java

此外,在编辑时,它将EditText控件放置在NumberPicker中心区域的顶部。即使执行一些技巧(例如,通过编程单击将EditText设置为焦点),更改此类EditText控件也无法解决问题,因为一旦再次滚动或将焦点设置为布局中的其他View,EditText将被隐藏,您将失去这种色彩效果。

唯一的解决方案是创建一个新的NumberPicker控件。例如,您可以使用实际的NumberPicker源代码,并使其适应您的需求。您需要使用 onDraw 方法进行调整。

答案 2 :(得分:1)

enter image description here我尝试遵循许多答案,所有答案都设置了数字的颜色。

我想出了如何仅更改选定数字的颜色 r。在您的NumberPicker中设置OnTouchListener。

numberPicker.setOnTouchListener(new OnTouchListener() {
                    @Override
                    public boolean onTouch(final View v, MotionEvent event) {
                        currentTouchAction = event.getAction();
                        if (currentTouchAction == MotionEvent.ACTION_UP) {
                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    if (currentTouchAction == MotionEvent.ACTION_UP) {
                                        setSelectedTextColor((NumberPicker)v, selectedColorRes);
                                    }
                                }
                            }, 300);
                        }
                        return false;
                    }
                });

及以下代码用于更改所选数字的颜色。您可能必须使用“ performClick()” 动态地应用颜色。

如果您这样做,选择器将立即停止。这就是为什么我将postDelayed(300)放在上面。用户可以多次拖动数字选择器以选择利润数字。如果将其放在postDelay()上方并等待几毫秒,则可以平滑滚动。

public void setSelectedTextColor(NumberPicker np, int colorRes) {
    final int count = np.getChildCount();
    for(int i = 0; i < count; i++){
        View child = np.getChildAt(i);
        if(child instanceof EditText){
            try{
                Field selectorWheelPaintField = np.getClass().getDeclaredField("mSelectorWheelPaint");
                selectorWheelPaintField.setAccessible(true);
                ((EditText) child).setTextColor(mContext.getResources().getColor(colorRes));
                np.performClick();
            }
            catch(NoSuchFieldException e){
            }
            catch(IllegalArgumentException e){
            }
        }
    }
}

答案 3 :(得分:0)

我认为您可以使用小部件的方法NumberPicker.OnValueChangeListener来使用setOnValueChangedListener(...)

在回调中,您获得了picker并可以按照您想要的方式更改样式。