[Android]NumberPicker选中的项目如何改变颜色

9

在NumberPicker中,是否有可能更改所选项目的颜色,使每次出现新的中心子TextView时更改其颜色为我喜欢的颜色?我没有找到任何样式或API可以公开关于这个问题。

4个回答

4

enter image description here我尝试遵循许多答案,但它们都设置了整个数字的颜色。

我找到了如何仅更改所选数字的颜色。在您的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){
            }
        }
    }
}

请附上完整的代码,以便显示一个数字选择器,并且我们可以更改其选定字段的颜色。 - MMG
@MMG 你有初始化 "NumberPicker numberpicker" 吗?如果你复制我的代码并使用它,它会很好用... - youngwoon
请在一个活动中将您的代码按正确顺序放置,我会测试它,如果它能正常工作,您将获得奖励。 - MMG
@MMG 抱歉...我不明白为什么你不能使用那段代码...T_T 你需要做的是初始化 NumberPicker 对象。 - youngwoon
在您回答中放置的图像中,如果滚动,所选字段的颜色会改变吗?! - MMG
显示剩余7条评论

2

我认为你可以使用小部件的方法setOnValueChangedListener(...),并使用NumberPicker.OnValueChangeListener进行回调。

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


请附上完整的代码,以便显示一个数字选择器,并且我们可以更改其选定字段的颜色。 - MMG

2
根据设计,仅更改中心颜色是不可能的。如果您查看NumberPicker的源代码,特别是在onDraw方法中,您将看到小部件在渲染时没有区分中心项目和其余项目。所有文本都使用相同的颜色进行呈现。
源代码链接。从注释“//draw the selector wheel”开始检查onDraw方法:https://android.googlesource.com/platform/frameworks/base/+/0e2d281/core/java/android/widget/NumberPicker.java 此外,在编辑时,它会在NumberPicker中心区域放置一个EditText控件。即使您执行一些技巧(例如执行编程点击以将EditText设置为焦点),更改此类EditText控件也无法解决问题,因为只要再次滚动或将焦点设置为布局中的其他视图,EditText将被隐藏,您将失去这种颜色效果。
唯一的解决方案是创建一个新的NumberPicker控件。例如,您可以使用实际的NumberPicker源代码,并根据需要进行调整。您需要在onDraw方法中进行调整。

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();  
}

你的回答与 https://dev59.com/kGAg5IYBdhLWcg3w9fDm#22962195 非常相似,我已经尝试过那个答案。那个答案的问题是当我们点击或滚动数字选择器时,颜色会改变并且会恢复到默认颜色。 - MMG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接