zoukankan      html  css  js  c++  java
  • TimePickerDialog -下划线颜色修改

    首先就是去framework下去找与之相关的theme属性

    最开始的时候,直接找的是<item name="datePickerStyle">@style/Widget.Funui.DatePicker</item> ,但是,往父类里面找的话,并没有找到有效属性,仅仅就有一个布局

    <item name="android:internalLayout">@android:layout/date_picker_holo</item>属性,然后就从这里着手,看到了一个布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:orientation="horizontal"
        android:gravity="center">
    
        <LinearLayout android:id="@+id/pickers"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="horizontal"
            android:gravity="center">
    
            <!-- Month -->
            <NumberPicker
                android:id="@+id/month"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dip"
                android:layout_marginBottom="16dip"
                android:layout_marginStart="8dip"
                android:layout_marginEnd="8dip"
                android:focusable="true"
                android:focusableInTouchMode="true"
                />
    
            <!-- Day -->
            <NumberPicker
                android:id="@+id/day"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dip"
                android:layout_marginBottom="16dip"
                android:layout_marginStart="8dip"
                android:layout_marginEnd="8dip"
                android:focusable="true"
                android:focusableInTouchMode="true"
                />
     <!-- Year -->
            <NumberPicker
                android:id="@+id/year"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="16dip"
                android:layout_marginBottom="16dip"
                android:layout_marginStart="8dip"
                android:layout_marginEnd="16dip"
                android:focusable="true"
                android:focusableInTouchMode="true"
                />
    
        </LinearLayout>
    
        <!-- calendar view -->
        <CalendarView
            android:id="@+id/calendar_view"
            android:layout_width="245dip"
            android:layout_height="280dip"
            android:layout_marginStart="16dip"
            android:layout_marginEnd="16dip"
            android:layout_weight="1"
            android:focusable="true"
            android:focusableInTouchMode="true"
            />
    
    </LinearLayout>

    发现其中并没有关于下划线的控件,后来感觉这个应该跟NumberPicker 有关,进入后,发现这个控件中有对下划线的绘制,然后就再次到theme下寻找这个控件的属性,找到了一条

    <item name="numberPickerStyle">@style/Widget.Funui.NumberPicker</item>,沿着这个属性往下找,找到了父类,如下

    <style name="Widget.Holo.NumberPicker" parent="Widget.NumberPicker">
            <item name="android:internalLayout">@android:layout/number_picker_with_selector_wheel</item>
            <item name="android:solidColor">@android:color/transparent</item>        
    <!--更改下划线的属性-->
    <item name="android:selectionDivider">@android:drawable/numberpicker_selection_divider</item> <item name="android:selectionDividerHeight">2dip</item> <item name="android:selectionDividersDistance">48dip</item> <item name="android:internalMinWidth">64dip</item> <item name="android:internalMaxHeight">180dip</item> <item name="virtualButtonPressedDrawable">?android:attr/selectableItemBackground</item> </style>

    然后我们在framework中替换这条属性以后,确实发生了作用,但是,当我们尝试在应用中进行修改的时候,这时候又遇到了一个问题,就是,如果我们按照如下的方法进行修改

    <resources>
        <style name="Settings.Theme" parent="Custom_Settings_Theme">
            <item name="apnPreferenceStyle">@style/ApnPreference</item>
            <item name="android:actionBarTabTextStyle">@style/customActionBarTabTextStyle</item>
            <item name="android:actionBarStyle">@style/SettingsBarStyle</item>
            <item name="android:actionBarTabStyle">@style/SettingsActionBarTabView</item>
            <item name="*android:actionMenuLandTextColor">#ffffff</item>
            <item name="android:actionMenuTextColor">@color/action_menu_text_color</item>
            <item name="*android:homeAsUpIndicator">@drawable/ic_ab_back_holo_dark_am</item>
            <item name="wifi_signal">@drawable/wifi_signal_light</item>
            <item name="android:windowFullscreen">true</item>
            <item name="android:switchStyle">@style/mySwitchStyle</item>
            <item name="android:listChoiceIndicatorSingle">@drawable/btn_radio_funui</item>
            <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_funui</item>
            <item name="android:alertDialogTheme">@style/Settings.Theme.AlterDialog</item>    
    <!--设置picker style-->
    <item name="*android:numberPickerStyle">@style/Settings.Theme.NumberPicker</item> </style> <style name="Settings.Theme.NumberPicker" parent="@*android:style/Widget.Funui.NumberPicker"> <item name="*android:selectionDivider">@drawable/numberpicker_selection_divider</item> </style>

    这时候你会发现,我们的设置并没有起到作用,然后替换第二种

    也就是在代码中创建picker的时候,传入一个属性

    new TimePickerDialog(this, SchedulePowerOnOff.Theme.NumberPicker, this, mHour, mMinutes, DateFormat.is24HourFormat(this)).show();

    这时候你会发现又出现了问题,那就是这个时间弹出来的时候,不具有dialog风格了,也就是说,你的属性过滤掉了dialog风格,因为说到底,这个TimePickerDialog外层就是一个dialog

    最后听了同事的方法,完美解决了问题,那就是,在dialog属性里面添加TimePickerDialog的风格,如下

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="SchedulePowerOnOff.Theme" parent="@android:style/Theme.Funui">
            <item name="android:windowFullscreen">true</item>
            <item name="android:actionBarStyle">@style/actionbar_def_style</item>
            <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_funui</item>
            <item name="android:switchStyle">@style/mySwitchStyle</item> 
    <!--这个是关键,是对picker产生作用的过度属性-->
    <item name="android:alertDialogTheme">@style/SchedulePowerOnOff.Theme.AlertDialog</item> <!--dialog外层的picker属性产生影响-->
    <item name="*android:numberPickerStyle">@style/SchedulePowerOnOff.Theme.NumberPicker</item> </style> <style name="mySwitchStyle" parent="@*android:style/Widget.Funui.CompoundButton.Switch"> <item name="android:track">@drawable/switch_track_funui</item> </style> <style name="SchedulePowerOnOff.Theme.AlertDialog" parent="@*android:style/Theme.Funui.Dialog.Alert"> <item name="android:listChoiceIndicatorSingle">@drawable/btn_radio_funui</item> <item name="android:listChoiceIndicatorMultiple">@drawable/btn_check_funui</item> <item name="*android:numberPickerStyle">@style/SchedulePowerOnOff.Theme.NumberPicker</item> </style> <style name="actionbar_def_style" parent="@android:style/Widget.Funui.ActionBar"> <item name="android:displayOptions">homeAsUp|showTitle</item> <item name="android:background">#b54cff</item> </style> <style name="SchedulePowerOnOff.Theme.NumberPicker" parent="@*android:style/Widget.Funui.NumberPicker"> <item name="*android:selectionDivider">@drawable/numberpicker_selection_divider</item> 
    <!--下划线的宽度-->     
            <item name="android:selectionDividerHeight">0.5dip</item>
    </style> </resources>

    这个其实你会发现,以后所有类似的情况都可以用这中方法解决,也就是说,如果一个控件里面包含其他的控件,想在theme中更改内层的控件,就必须在他的外层中进行修改。注意,这时候他的父类集成的是Theme.

  • 相关阅读:
    Codeforces 934 B.A Prosperous Lot
    Codeforces 934 A.Compatible Pair
    UVA 12898
    Codeforces Round #376 (Div. 2) C. Socks bfs
    Codeforces Round #377 (Div. 2) C. Sanatorium 水题
    Codeforces Round #377 (Div. 2) D. Exams 二分
    Codeforces Beta Round #91 (Div. 1 Only) E. Lucky Array 分块
    hdu 5154 Harry and Magical Computer 拓扑排序
    Codeforces Round #272 (Div. 2) C. Dreamoon and Sums 数学
    Codeforces Round #288 (Div. 2) C. Anya and Ghosts 模拟
  • 原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_time_15011917.html
Copyright © 2011-2022 走看看