[Android]NumberPicker 选中项改变颜色

[Android]NumberPicker selected item change color

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


enter
我尝试了很多答案,所有答案都在设置整数的颜色。

我想出了如何仅更改所选数字的颜色。在 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){
            }
        }
    }
}
相关讨论
  • 嗨,你能更好地解释你的答案吗?代码中的 currentTouchAction 是什么?
  • @MMG 嗨,currentTouchAction 是为了显示用户现在采取的触摸动作。我用它来找出用户何时完成拖动。
  • @MMG如果您喜欢该代码,则当用户完成拖动时,所选项目的颜色会发生变化。
  • 所以,它是一个变量。请输入更多代码作为答案。我不知道我应该把代码放在哪里。
  • @MMG啊,是的,它是一个变量......我现在正在使用python,所以我认为它自然是变量。对不起。您可以在 numberpicker 对象上使用 setOnTouchListener() !如果你不能这样做,你能告诉我更多关于你的问题吗?
  • 请附上完整的代码,以便它显示一个数字选择器,我们可以更改其选定的字段颜色
  • @MMG您是否初始化了"NumberPicker numberpicker"?如果您复制我的代码并使用它,它会很好用......
  • 例如,在一项活动中,请按正确顺序排列您的代码,我将对其进行测试,如果它有效,您将获得赏金。
  • @MMG 抱歉...我无法理解为什么您不能使用该代码...T_T 您需要做的是初始化 NumberPicker 对象。
  • 好的,请输入一个完全有效的代码。做初始化和任何其他必要的事情。如果您想要赏金,当然可以这样做。 @youngwoon
  • 在您输入答案的图像中,如果您滚动所选字段的颜色会改变?!
  • 我的代码在这里:stackoverflow.com/q/64086987/12478830 请检查它,看看我的代码有什么问题。

设计上不可能只改变中心颜色。如果您查看 NumberPicker 的源代码,特别是在 onDraw 方法中,那么您将看到小部件在渲染时在中心项和其余项之间没有区别。所有文本都使用相同的颜色呈现。

源代码链接。检查从注释开始的 onDraw 方法 "//draw the selector wheel":https://android.googlesource.com/platform/frameworks/base//0e2d281/core/java/android/widget/NumberPicker.java

此外,在编辑时,它会在 NumberPicker 中心区域的顶部放置一个 EditText 控件。更改此类 EditText 控件不会解决问题,即使您执行一些技巧,例如执行编程单击以将 EditText 设置为焦点,因为一旦您再次滚动或将焦点设置到布局中的不同视图,EditText会被隐藏,你会失去这样的色彩效果。

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


您可以尝试使用以下代码。只需在此参数中传递您的 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();  
}
相关讨论
  • 您的答案与 stackoverflow.com/a/22962195/12478830 非常相似,我已经尝试过这个答案。该答案的问题是,当我们单击或滚动数字选择器时,颜色将被更改并恢复为默认颜色。

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

在回调中你会得到 picker 并且可以按照你想要的方式改变样式。

相关讨论
  • 请附上完整的代码,以便它显示一个数字选择器,我们可以更改其选定的字段颜色

以上是[Android]NumberPicker 选中项改变颜色的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>