更改NumberPicker分隔线颜色

Lau*_*ent 35 android numberpicker android-styles

在最近的Android版本中,数字选择器在绘制时使用蓝色分隔符(参见下图).

在此输入图像描述

我想改变这种颜色.有工作的解决方案吗?或者是一个包含更新版本的NumberPicker的库,它允许自定义分隔符颜色?

我尝试过android-numberpicker,但是由于库中的一些代码试图访问不存在的资源ID,我在运行时遇到错误(见下文).

android.content.res.Resources$NotFoundException: Resource ID #0x0
        at android.content.res.Resources.getValue(Resources.java:1123)
        at android.content.res.Resources.loadXmlResourceParser(Resources.java:2309)
        at android.content.res.Resources.getLayout(Resources.java:939)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:395)
        at net.simonvt.numberpicker.NumberPicker.<init>(NumberPicker.java:635)
        at net.simonvt.numberpicker.NumberPicker.<init>(NumberPicker.java:560)
        at net.simonvt.numberpicker.NumberPicker.<init>(NumberPicker.java:550)
Run Code Online (Sandbox Code Playgroud)

gab*_*bin 60

如果您只想更改颜色(基于stannums答案):

private void setDividerColor(NumberPicker picker, int color) {

    java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields();
    for (java.lang.reflect.Field pf : pickerFields) {
        if (pf.getName().equals("mSelectionDivider")) {
            pf.setAccessible(true);
            try {
                ColorDrawable colorDrawable = new ColorDrawable(color);
                pf.set(picker, colorDrawable);
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (Resources.NotFoundException e) {
                e.printStackTrace();
            }
            catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在那之后

setDividerColor(mNumberPicker, Color.GREEN);
Run Code Online (Sandbox Code Playgroud)

  • 好转.我注意到的一件事是确保使用'newColorDrawable(ctx.getResources().getColor(R.color.whatevercolor))'而不是'new ColorDrawable(R.color.whatevercolor)' (3认同)

Rub*_*Yoo 48

这对我有用而不使用反射.

my_layout.xml

<NumberPicker
   ...
   android:theme="@style/DefaultNumberPickerTheme" />
Run Code Online (Sandbox Code Playgroud)

Styles.xml(AppTheme是应用程序中的应用主题)

<style name="DefaultNumberPickerTheme" parent="AppTheme">
        <item name="colorControlNormal">@color/dividerColor</item>
</style>
Run Code Online (Sandbox Code Playgroud)

  • 只是一个善意的提醒.'colorControlNormal',仅适用于API 21及更高版本. (8认同)

Mar*_*ych 18

基于此(/sf/answers/1420399151/,虽然它是关于DatePicker)有几种方法:

  1. 在没有mSelectionDivider及其附属公司的情况下编写您自己的NumberPicker,或使用Vikram后向移植.在最后一种情况:

    1. github从lib下载
    2. 在res/drawable-xxx/np_numberpicker_selection_divider.9.png中更改drawable:

      • 透明(或其他).9.png
      • 在res/drawable中创建np_numberpicker_selection_divider.xml形状线资源(具有0dp高度或透明色).
    3. 或删除if (mSelectionDivider != null)来自的onDraw(Canvas)的方法分公司NumberPicker.java喜欢这里

  2. 使用反射访问private final field mSelectionDivider(详情:https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/NumberPicker.java) - 例如,请参阅此处的修改.我使用反射,但它不是最好的解决方案.


小智 12

我使用解决方法Java方法:

  private void setDividerColor (NumberPicker picker) {   

        java.lang.reflect.Field[] pickerFields = NumberPicker.class.getDeclaredFields();
        for (java.lang.reflect.Field pf : pickerFields) {
            if (pf.getName().equals("mSelectionDivider")) {
                pf.setAccessible(true);
                try {
                    //pf.set(picker, getResources().getColor(R.color.my_orange));
                    //Log.v(TAG,"here");
                    pf.set(picker, getResources().getDrawable(R.drawable.dot_orange));
                } catch (IllegalArgumentException e) {
                    e.printStackTrace();
                } catch (NotFoundException e) {
                    e.printStackTrace();
                } 
                catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                break;
            }
        }
        //}
     }
Run Code Online (Sandbox Code Playgroud)

或Kotlin方法:

private fun NumberPicker.setDividerColor(color: Int) {
    val dividerField = NumberPicker::class.java.declaredFields.firstOrNull { it.name == "mSelectionDivider" } ?: return
    try {
       dividerField.isAccessible = true
       dividerField.set(this,getResources().getDrawable(R.drawable.dot_orange))
    } catch (e: Exception) {
        e.printStackTrace()
    }
}
Run Code Online (Sandbox Code Playgroud)

并应用它

  setDividerColor(yourNumberPicker); // for java method
  yourNumberPicker.setDividerColor(Color.RED) // for kotlin method
Run Code Online (Sandbox Code Playgroud)