`

基于WheelView自定义的DatePickerDialog

阅读更多
本人利用WheelView写的一个DatePickerDialog
(还有一个TimePickerDialog,本人忘了在写在哪个项目里了,等找到了也贴上来)

先看图,有个直观的了解




DatePickerDialog代码:
import java.util.Calendar;

import com.widget.wheel.NumericWheelAdapter;
import com.widget.wheel.OnWheelScrollListener;
import com.widget.wheel.WheelView;
import com.yirui.youbao.app.R;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

/**
 * 
 * @author pythoner
 * 
 */
public class DatePickerDialog extends Dialog
{

    private Button btn_left, btn_right;

    private WheelView year, month, day;

    private String date;//初始化显示的日期,默认为当日

    public DatePickerDialog(Context context, String date)
    {
//        super(context);
        this(context, R.style.Theme_Dialog_NoTitle, date);
        // TODO Auto-generated constructor stub
    }

    public DatePickerDialog(Context context, int theme, String date)
    {
        super(context, theme);
        // TODO Auto-generated constructor stub
        this.date = date;
        init();
    }

    private void init()
    {
        this.setCanceledOnTouchOutside(true);
        this.setCancelable(true);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dialog_date_picker);

        initViews();
        initValues();
    }

    private void initViews()
    {
        btn_left = (Button) findViewById(R.id.btn_left);
        btn_left.setOnClickListener(clickListener);
        btn_right = (Button) findViewById(R.id.btn_right);
        btn_right.setOnClickListener(clickListener);

        String icurYear, icurMonth, icurDay;
        Calendar c = Calendar.getInstance();
        int curYear = c.get(Calendar.YEAR);
        if (date == null || date.length() < 10)
        {// 格式不正确
            int curMonth = c.get(Calendar.MONTH);
            int curDay = c.get(Calendar.DAY_OF_MONTH);
            icurYear = String.valueOf(curYear);
            icurMonth = String.valueOf(curMonth + 1);
            icurDay = String.valueOf(curDay);
        }
        else
        {// 年月日
            icurYear = date.substring(0, 4);
            icurMonth = date.substring(5, 7);
            icurDay = date.substring(8, 10);
        }

        year = (WheelView) findViewById(R.id.year);
        year.setAdapter(new NumericWheelAdapter(curYear - 2, curYear));
        // year.setLabel("年");
        year.setCurrentItem(Integer.parseInt(icurYear) - Integer.parseInt(year.getAdapter().getItem(0)));

        month = (WheelView) findViewById(R.id.month);
        month.setAdapter(new NumericWheelAdapter(1, 12));// "%02d"
        // month.setLabel("月");
        month.setCyclic(true);
        month.setCurrentItem(Integer.parseInt(icurMonth) - 1);

        int daysOfMounth = getDaysOfMounth();
        day = (WheelView) findViewById(R.id.day);
        day.setAdapter(new NumericWheelAdapter(1, daysOfMounth));
        // day.setLabel("日");
        day.setCyclic(true);
        day.setCurrentItem(Integer.parseInt(icurDay) - 1);

        OnWheelScrollListener scrollListener = new OnWheelScrollListener()
        {
            public void onScrollingStarted(WheelView wheel)
            {
            }

            public void onScrollingFinished(WheelView wheel)
            {
                int daysOfMounth = getDaysOfMounth();
                day.setAdapter(new NumericWheelAdapter(1, daysOfMounth));
            }
        };

        year.addScrollingListener(scrollListener);
        month.addScrollingListener(scrollListener);
        // day.addScrollingListener(scrollListener);

    }

    private int getDaysOfMounth()
    {
        int mMonth = Integer.parseInt(month.getAdapter().getItem(month.getCurrentItem()));
        switch (mMonth)
        {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                return 31;
            case 4:
            case 6:
            case 9:
            case 11:
                return 30;
            case 2:
                int mYear = Integer.parseInt(year.getAdapter().getItem(year.getCurrentItem()));
                if (mYear % 4 == 0 && mYear % 100 != 0 || mYear % 400 == 0)
                {
                    return 29;
                }
                else
                {
                    return 28;
                }
        }
        return -1;
    }

    private void initValues()
    {

    }

    View.OnClickListener clickListener = new View.OnClickListener()
    {

        @Override
        public void onClick(View v)
        {
            // TODO Auto-generated method stub
            switch (v.getId())
            {
                case R.id.btn_left:
                    dismiss();
                    break;
                case R.id.btn_right:
                    String mYear = year.getAdapter().getItem(year.getCurrentItem());
                    String mMonth = month.getAdapter().getItem(month.getCurrentItem());
                    String mDay = day.getAdapter().getItem(day.getCurrentItem());
                    if (mDay == null || mDay.length() == 0)
                    {
                        mDay = "1";
                    }
                    if (Integer.parseInt(mMonth) < 10)
                    {
                        mMonth = "0" + mMonth;
                    }
                    if (Integer.parseInt(mDay) < 10)
                    {
                        mDay = "0" + mDay;
                    }
                    if (onOKClickListener != null)
                    {
                        onOKClickListener.onOKClick(mYear, mMonth, mDay);
                    }
                    dismiss();
                    break;

                default:
                    break;
            }
        }

    };

    private OnOKClickListener onOKClickListener;

    public interface OnOKClickListener
    {
        public void onOKClick(String year, String month, String date);
    }

    public void setOnOKClickListener(OnOKClickListener onOKClickListener)
    {
        this.onOKClickListener = onOKClickListener;
    }
}


DatePickerDialog的布局文件:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="250dp"
    android:layout_height="wrap_content"
    android:orientation="vertical" 
    android:gravity="center"
    android:background="@drawable/bg_picker_dialog"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:padding="8dp" 
        >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" 
            android:layout_weight="1" 
            android:gravity="center_horizontal"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:scaleType="fitCenter"
                />

            <com.widget.wheel.WheelView
                android:id="@+id/year"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginBottom="10dip"
                android:layout_marginTop="10dip"
                android:layout_weight="1" 
                />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:scaleType="fitCenter"
                />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" 
            android:layout_weight="1" 
            android:gravity="center_horizontal"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:scaleType="fitCenter"
                />

            <com.widget.wheel.WheelView
                android:id="@+id/month"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginBottom="8dip"
                android:layout_marginTop="8dip"
                android:layout_weight="1" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:scaleType="fitCenter"
                />
        </LinearLayout>
        
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" 
            android:layout_weight="1" 
            android:gravity="center_horizontal"
            >

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:scaleType="fitCenter"
                />

            <com.widget.wheel.WheelView
                android:id="@+id/day"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_marginBottom="8dip"
                android:layout_marginTop="8dip"
                android:layout_weight="1" />

            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:scaleType="fitCenter"
                />
        </LinearLayout>
        
    </LinearLayout>


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:orientation="horizontal"
        android:background="@drawable/line_top_with_blue"
        >

        <Button
            android:id="@+id/btn_left"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingBottom="8dip"
            android:paddingTop="8dip"
            android:text="@string/cancel"
            android:textColor="@android:color/black"
            android:textSize="@dimen/font_big" 
            android:background="@drawable/bg_btn_trans_blue_with_no_corner"
            />


        <View 
            android:layout_width="@dimen/line_width"
            android:layout_height="match_parent"
            android:background="@color/primary"
            />
        
        <Button
            android:id="@+id/btn_right"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:paddingBottom="8dip"
            android:paddingTop="8dip"
            android:text="@string/confirm"
            android:textColor="@android:color/black"
            android:textSize="@dimen/font_big" 
            android:background="@drawable/bg_btn_trans_blue_with_no_corner"
            />
    </LinearLayout>

</LinearLayout>


style:
<style name="Theme_Dialog_NoTitle" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:backgroundDimEnabled">true</item>
        <item name="android:windowBackground">@android:color/transparent</item>
    </style>



使用:
dialog = new DatePickerDialog(context, R.style.Theme_Dialog, btn_startDate.getText().toString().trim());
			dialog.setOnOKClickListener(new DatePickerDialog.OnOKClickListener()
            {

                @Override
                public void onOKClick(String year, String month, String date)
                {
                    // TODO Auto-generated method stub
                    //dosomething
                    //btn_startDate.setText(year + "-" + month + "-" + date);
                   
                }
            });
            dialog.show();


WheelView类见附件,直接加入到你的工程中即可


安卓选择器类库,包括日期时间选择器等:AndroidPicker
http://www.open-open.com/lib/view/open1445774842960.html
  • 大小: 23.1 KB
分享到:
评论
1 楼 fwx04134 2016-03-29  

相关推荐

    选择时间日历控件DatePickerDialog(从外包项目中挖出来整理的)源码

    `DatePickerDialog`是Android SDK提供的一种标准对话框组件,它基于`AlertDialog`构建,内含一个`DatePicker`,用户可以通过滚动年份、月份和日期来选择一个特定的日期。使用`DatePickerDialog`通常涉及以下步骤: ...

    自定义时间选择器

    2. **使用第三方库**:有许多优秀的开源库提供了自定义时间选择器的解决方案,如WheelView、android-times-square等。它们通常提供了丰富的定制选项和良好的性能,可以快速集成到项目中。 3. **基于现有控件改造**...

    Android联动选择时间和地址

    这个开源项目基于`wheelview`库,提供了一个自定义的时间地址选择对话框,通过优化显示效果,提升了用户体验。 首先,我们要理解`wheelview`是什么。`WheelView`是Android平台上的一个可滚动的选择器控件,类似于...

    Android 日期数字选择器

    这些对话框是基于Android系统的Material Design风格,提供了一种标准的用户交互方式。使用它们非常简单,只需要创建实例并设置回调监听器: ```java DatePickerDialog datePicker = new DatePickerDialog(this, new...

    安卓滚轮式日期时间选择

    自定义控件通常基于`WheelView`或`HorizontalScrollView`,通过布局文件和代码配合,实现滚动条的显示和交互。 `WheelView`是一种可滚动的选择器,可以显示一系列连续的数据项,非常适合用来构建日期和时间选择器。...

    android时间选择器

    可以通过自定义布局和使用轮盘控件(WheelView)来实现更个性化的选择器。此外,第三方库如`android-timepicker-dialog`和`android-date-time-picker`提供了更多的定制选项和更好的兼容性。 4. **日期和时间的组合*...

    Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

    对于自定义选择,代码展示了`DataPickerDialog`的使用,同样基于Builder模式构建。开发者可以传递一个字符串列表`List&lt;String&gt;`到`setData()`方法,然后在`OnDataSelectedListener`回调中处理用户的选中操作。 在`...

    Android 日期选择器实例代码

    你还可以通过第三方库,如`WheelView`或`MaterialDateTimePicker`,来实现更复杂的日期和时间选择功能。 总结来说,Android的`DatePickerDialog`是一个方便的组件,用于在对话框中让用户选择日期。开发者可以通过...

    android畅言评论+仿iOS单行的日期选择器功能

    本项目是一个基于Eclipse的工程文件,主要目标是集成畅言开放平台的评论功能,并且实现一个类似iOS风格的单行日期选择器。这样的设计可以使应用在保持功能完整性的同时,提供更接近iOS用户体验的界面,增加用户对...

    Android 地区和日期选择器.zip

    1. **滚轮视图的实现**:滚轮视图(WheelView)通常基于Android的`ScrollView`或`Gallery`组件进行扩展,通过监听滑动事件来实现滚动效果。开发者可能会使用`onScrollChanged()`方法来追踪滚动状态,并更新显示内容...

Global site tag (gtag.js) - Google Analytics