【问题标题】:[Android]NumberPicker selected item change color[Android]NumberPicker 选中项改变颜色
【发布时间】:2016-03-24 00:38:35
【问题描述】:

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

【问题讨论】:

    标签: android


    【解决方案1】:

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

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

    【讨论】:

    • 请附上完整的代码,以便它显示一个数字选择器,我们可以更改其选定的字段颜色
    【解决方案2】:

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

    我想出了如何仅为选定的数字更改颜色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){
                }
            }
        }
    }
    

    【讨论】:

    • 您好,您能更好地解释您的答案吗?代码中的currentTouchAction是什么?
    • @MMG 你好,currentTouchAction 是为了显示用户现在采取了哪些触摸动作。我用它来查明用户何时完成拖动。
    • @MMG 如果您喜欢该代码,当用户完成拖动时,所选项目的颜色将会改变。
    • 所以,它是一个变量。请输入更多代码作为答案。我不知道我应该把代码放在哪里。
    • @MMG 啊,是的,它是一个变量......我现在正在使用 python,所以我认为它自然是变量。对不起。您可以在 numberpicker 对象上使用 setOnTouchListener() !如果你做不到,你能告诉我更多关于你的问题吗?
    【解决方案3】:

    您可以尝试使用以下代码。只需在此参数中传递您的 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 非常相似,我已经尝试过这个答案。该答案的问题是,当我们单击或滚动数字选择器时,颜色将被更改并恢复为默认颜色。
    【解决方案4】:

    根据设计无法更改仅更改中心颜色。如果您查看 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 方法中进行调整。

    【讨论】:

      猜你喜欢
      • 2016-03-06
      • 2013-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 2014-08-05
      • 1970-01-01
      相关资源
      最近更新 更多