【问题标题】:Change android numberpicker divider color更改 android numberpicker 分隔线颜色
【发布时间】:2013-09-19 05:31:34
【问题描述】:

我想将上面显示的数字选择器的分隔线颜色(蓝色)更改为透明。 我尝试了很多东西,比如

number_picker.setDividerDrawable(getResources().getDrawable(R.color.transparent));
number_picker.setShowDividers(NumberPicker.SHOW_DIVIDER_NONE);

我也尝试在 xml 中设置 android:divider 但他们都没有工作

然后我尝试使用样式设置它,但是当我将以下条目放入我的样式中时,它说所需的最低版本是 14,而我的应用程序的最低版本是 11

<style name="AppTheme" parent="@android:style/Widget.DeviceDefault.DatePicker">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="android:divider">@color/transparent</item>
</style>

谁能建议我如何做到这一点?

【问题讨论】:

  • 我为这个问题发布了一个简单的解决方案here
  • 我为这个问题发布了一个简单的解决方案here

标签: android transparent divider numberpicker


【解决方案1】:

这在不使用反射的情况下对我有用。

my_layout.xml

<NumberPicker
   ...
   android:theme="@style/DefaultNumberPickerTheme" />

Styles.xml(AppTheme是我在应用中的应用主题)

<style name="DefaultNumberPickerTheme" parent="AppTheme">
        <item name="colorControlNormal">@color/dividerColor</item>
</style>

来自https://stackoverflow.com/a/43985361/1915831

【讨论】:

    【解决方案2】:

    使用反射,我们可以做到这一点

    public DatePickerDialog customDatePicker(OnDateSetListener listener, Calendar cal) 
    {
        Calendar c;
        if (cal == null) {
            c = Calendar.getInstance();
        } else {
            c = cal;
        }
    
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int day = c.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog newFragment = new DatePickerDialog(this, listener, year, month, day);
    
        // removes the original topbar:
        newFragment.setTitle(""); 
    
        // Divider changing:
        DatePicker dpView = newFragment.getDatePicker(); 
        LinearLayout llFirst = (LinearLayout) dpView.getChildAt(0);
        LinearLayout llSecond = (LinearLayout) llFirst.getChildAt(0);
        for (int i = 0; i < llSecond.getChildCount(); i++) {
            NumberPicker picker = (NumberPicker) llSecond.getChildAt(i); // Numberpickers in llSecond
            // reflection - picker.setDividerDrawable(divider); << didn't seem to work.
            Field[] pickerFields = NumberPicker.class.getDeclaredFields();
            for (Field pf : pickerFields) {
                if (pf.getName().equals("mSelectionDivider")) {
                    pf.setAccessible(true);
                    try {
                        pf.set(picker, getResources().getColor(R.color.green ));
                    } catch (IllegalArgumentException e) {
                        e.printStackTrace();
                    } catch (NotFoundException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    break;
                }
            }
        }
        // New top:
        int titleHeight = 90;
        // Container:
        LinearLayout llTitleBar = new LinearLayout(this);
        llTitleBar.setOrientation(LinearLayout.VERTICAL);
        llTitleBar.setBackground(new ColorDrawable(Color.parseColor("#00afac")));
        llTitleBar.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, titleHeight));
    
        // TextView Title:
        TextView tvTitle = new TextView(this);
        tvTitle.setText("Select Birthday");
        tvTitle.setGravity(Gravity.CENTER);
        tvTitle.setPadding(10, 10, 10, 10);
        tvTitle.setTextSize(24);
        tvTitle.setTextColor(Color.parseColor("#FFFFFF"));
        tvTitle.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, titleHeight-2));
        llTitleBar.addView(tvTitle);
    
        // View line:
        View vTitleDivider = new View(this);
        vTitleDivider.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 2));
        vTitleDivider.setBackgroundColor(getResources().getColor(R.color.green));
        llTitleBar.addView(vTitleDivider);
    
        dpView.addView(llTitleBar);
        FrameLayout.LayoutParams lp = (android.widget.FrameLayout.LayoutParams) llFirst.getLayoutParams();
        lp.setMargins(0, titleHeight, 0, 0);
        return newFragment;
    }
    

    //----------------

    将此函数称为

    customDatePicker(this,calander).show();
    

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 2021-03-14
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多