• 关于调整TimePicker, DatePicker的大小,样式


      最近在做一个时间选择器,想把要DatePicker和TimePicker放在一起使用,无赖他们的大小样式是被Google写死了,找不到相应的属性来设置,自己花了点时间写了一个使用的Demo,运行的效果如下。

      

      

      首先看布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:context=".TimeActivity" >
    
        <NumberPicker
            android:id="@+id/date_picker"
            android:layout_width="100dip"
            android:layout_height="match_parent"
            android:layout_margin="10dip"
            />
        
          <TimePicker 
            android:id="@+id/time_picker"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_margin="10dip"
            /> 
            
    </LinearLayout>

      

      左边使用了一个NumberPicker替换DatePicker的使用,只显示月日星期

            datePicker = (NumberPicker)findViewById(R.id.date_picker);
            datePicker.setMinValue(1);
            datePicker.setMaxValue(365);
            
            calendar = Calendar.getInstance();
            calendar.setLenient(true);
            Calendar tempCal = (Calendar) calendar.clone();
            long curTime = tempCal.getTimeInMillis();
            int curDay = calendar.get(Calendar.DAY_OF_YEAR);
            //此处简单的使用365代表全年的天数
            String[] displayedValues = new String[365];
            for (int i = 0; i < 365; i++) 
            {
                tempCal = add(curTime, i - curDay + 1, Calendar.DAY_OF_MONTH);
                //格式化为月日星期
                displayedValues[i] = String.format("%tb %td %ta", tempCal, tempCal, tempCal);
            }
            datePicker.setDisplayedValues(displayedValues);
            datePicker.setValue(calendar.get(Calendar.DAY_OF_YEAR));

      右边使用24小时制的TimePicker, 显示小时和分钟的NumberPicker的(TimePicker实际上就是由NumberPicker组成,而NumberPicker在android4.2包含一个EditText控件)

            tp = (TimePicker)findViewById(R.id.time_picker);
            //设置成24小时,隐藏AM/PM picker
            tp.setIs24HourView(true);
            //修改TimePicker字体的大小
            setNumberPickerTextSize(tp);
            //修改TimePicker中NumberPicker的大小
            resizeTimerPicker(tp);

      修改字体大小的基本思路是:首先由TimePicker控件找到里边的NumberPicker控件,然后再找到里边的EditText控件,从而就可以自由设置它的大小,颜色。 从效果图片可以看到,只能设置当前的字体,上一个/下一个还是原来的大小,此处还需要查看源码找它的原因,如果有人知道也请告之,谢谢。

        private List<NumberPicker> findNumberPicker(ViewGroup viewGroup)
        {
            List<NumberPicker> npList = new ArrayList<NumberPicker>();
            View child = null;
            
            if (null != viewGroup)
            {
                for (int i = 0; i < viewGroup.getChildCount(); i++)
                {
                    child = viewGroup.getChildAt(i);
                    if (child instanceof NumberPicker)
                    {
                        npList.add((NumberPicker)child);
                    }
                    else if (child instanceof LinearLayout)
                    {
                        List<NumberPicker> result = findNumberPicker((ViewGroup)child);
                        if (result.size() > 0)
                        {
                            return result;
                        }
                    }
                }
            }
            
            return npList;
        }
        
        private EditText findEditText(NumberPicker np)
        {
            if (null != np)
            {
                for (int i = 0; i < np.getChildCount(); i++)
                {
                    View child = np.getChildAt(i);
                    
                    if (child instanceof EditText)
                    {
                        return (EditText)child;
                    }
                }
            }
            
            return null;
        }
        
        private void setNumberPickerTextSize(ViewGroup viewGroup)
        {
            List<NumberPicker> npList = findNumberPicker(viewGroup);
            if (null != npList)
            {
                for (NumberPicker np : npList)
                {
                    EditText et = findEditText(np);
                    et.setFocusable(false);
                    et.setGravity(Gravity.CENTER);
                    et.setTextSize(10);
                    
                }
            }
        }

      修改TimpePicker的大小,实际上就是设置NumberPicker的大小,由于字体大小设置不完全,故这个地方也不能把NumberPicker设置得太小,只能稍微减小它的大小

        private void resizeTimerPicker(TimePicker tp)
        {
            List<NumberPicker> npList = findNumberPicker(tp);
            
            for (NumberPicker np : npList)
            {
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(100, LayoutParams.WRAP_CONTENT);
                params.setMargins(10, 0, 10, 0);
                np.setLayoutParams(params);
            }
        }

      至此,显示月日星期和时间的Picker就形成了,当然你也可以全部都用NumberPicker来完成,那样会麻烦一点,由于时间花的还不够深入,故还有一些欠缺,抱歉,如果看到的人有其他补充请你也告之我,谢谢。

      最后补充一种修改Picker的字体颜色的方法

      首先在styles.xml 文件里边加入Theme style,设置所有EditText的颜色(因为TimePicker和DatePicker 使用的基本控件都是EditText)

        <style name="Theme.picker" parent="android:Theme.Holo.Light">
            <item name="android:editTextStyle">@style/Widget.EditText.White</item>
        </style>
        
        <style name="Widget.EditText.White" parent="@android:style/Widget.EditText">
            <item name="android:textColor">@color/red</item>
        </style>

      然后在应用的 AndroidManifest.xml文件中的Activity下边增加属性 android:theme="@style/Theme.picker",表示该Acitivity使用该theme. 这样Picker就会显示你设置好的颜色。

        <activity
                android:name="com.example.timewidget.TimeActivity"
                android:label="@string/app_name" 
                android:theme="@style/Theme.picker">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>

      

  • 相关阅读:
    DevExpress第三方控件之ASPxGridView
    单一职责原则(SRP)
    .NET 4 并行(多核)编程系列之一入门介绍
    .NET 分布式架构开发实战之二
    .NET 分布式架构开发实战之四
    .NET 分布式架构开发实战之三
    .NET 分布式架构开发实战之一
    .NET 4 并行(多核)编程系列之三
    .NET 4 并行(多核)编程系列之四
    .NET 分布式架构开发实战五
  • 原文地址:https://www.cnblogs.com/shaddock2013/p/3182734.html
Copyright © 2020-2023  润新知