Android仿ios年龄滚轮大全

来源:互联网 发布:手机淘宝的物流在哪看 编辑:程序博客网 时间:2024/05/22 00:51

新项目Android和ios要做成统一样式,年龄,性别,时间,要做成滚轮效果,Android没有原生控件,只能自己定义,于是我较劲脑汁,终于写出来,本着分享精神,贴出部分代码,直接拷贝就能用。


先看效果图,如果符合你的需求,再采纳

时间

年龄



性别



废话不多说,直接上代码

布局

activity_main.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout    android:id="@+id/activity_main"    xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"   >  <TextView      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:text="Hello World!"      android:id="@+id/textView"/>  <Button      android:text="生日"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_below="@+id/textView"      android:layout_alignParentLeft="true"      android:layout_alignParentStart="true"      android:id="@+id/button"      android:onClick="date"      android:layout_alignParentRight="true"      android:layout_alignParentEnd="true"/>  <Button      android:text="时间"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_below="@+id/button"      android:layout_alignParentLeft="true"      android:layout_alignParentStart="true"      android:id="@+id/button2"      android:onClick="time"      android:layout_alignParentRight="true"      android:layout_alignParentEnd="true"/>  <Button      android:text="性别"      android:onClick="zidingyi"      android:layout_width="wrap_content"      android:layout_height="wrap_content"      android:layout_below="@+id/button2"      android:layout_alignParentLeft="true"      android:layout_alignParentStart="true"      android:id="@+id/button3"      android:layout_alignParentRight="true"      android:layout_alignParentEnd="true"/></RelativeLayout>

MainActivity

public class MainActivity extends AppCompatActivity {    private Dialog dateDialog, timeDialog, chooseDialog;    private TextView mTextView;    private List<String> list = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mTextView = (TextView) findViewById(R.id.textView);        String[] data = getResources().getStringArray(R.array.list);        for (String str : data) {            list.add(str);        }    }    /**     * chooseDialog     */    private void showChooseDialog(List<String> mlist) {        DataPickerDialog.Builder builder = new DataPickerDialog.Builder(this);        chooseDialog = builder.setData(mlist).setSelection(1).setTitle("取消")                .setOnDataSelectedListener(new DataPickerDialog.OnDataSelectedListener() {                    @Override                    public void onDataSelected(String itemValue, int position) {                        mTextView.setText(itemValue);                    }                    @Override                    public void onCancel() {                    }                }).create();        chooseDialog.show();    }    private void showDateDialog(List<Integer> date) {        DatePickerDialog.Builder builder = new DatePickerDialog.Builder(this);        builder.setOnDateSelectedListener(new DatePickerDialog.OnDateSelectedListener() {            @Override            public void onDateSelected(int[] dates) {                mTextView.setText(dates[0] + "-" + (dates[1] > 9 ? dates[1] : ("0" + dates[1])) + "-"                        + (dates[2] > 9 ? dates[2] : ("0" + dates[2])));            }            @Override            public void onCancel() {            }        })                .setSelectYear(date.get(0) - 1)                .setSelectMonth(date.get(1) - 1)                .setSelectDay(date.get(2) - 1);        builder.setMaxYear(DateUtil.getYear());        builder.setMaxMonth(DateUtil.getDateForString(DateUtil.getToday()).get(1));        builder.setMaxDay(DateUtil.getDateForString(DateUtil.getToday()).get(2));        dateDialog = builder.create();        dateDialog.show();    }    private void showTimePick() {        if (timeDialog == null) {            TimePickerDialog.Builder builder = new TimePickerDialog.Builder(this);            timeDialog = builder.setOnTimeSelectedListener(new TimePickerDialog.OnTimeSelectedListener() {                @Override                public void onTimeSelected(int[] times) {                    mTextView.setText(times[0] + ":" + times[1]);                }            }).create();        }        timeDialog.show();    }    public void time(View v) {        showTimePick();    }    public void date(View v) {        showDateDialog(DateUtil.getDateForString("1990-01-01"));    }    public void zidingyi(View v) {        showChooseDialog(list);    }}


DataPickerDialog
public class DataPickerDialog extends Dialog {    private Params params;    public DataPickerDialog(Context context, int themeResId) {        super(context, themeResId);    }    private void setParams(DataPickerDialog.Params params) {        this.params = params;    }    public void setSelection(String itemValue) {        if (params.dataList.size() > 0) {            int idx = params.dataList.indexOf(itemValue);            if (idx >= 0) {                params.initSelection = idx;                params.loopData.setCurrentItem(params.initSelection);            }        }    }    public interface OnDataSelectedListener {        void onDataSelected(String itemValue, int position);        void onCancel();    }    private static final class Params {        private boolean shadow = true;        private boolean canCancel = true;        private LoopView loopData;        private String title;        private String unit;        private int initSelection;        private OnDataSelectedListener callback;        private final List<String> dataList = new ArrayList<>();    }    public static class Builder {        private final Context context;        private final DataPickerDialog.Params params;        public Builder(Context context) {            this.context = context;            params = new DataPickerDialog.Params();        }        private final String getCurrDateValue() {            return params.loopData.getCurrentItemValue();        }        public Builder setData(List<String> dataList) {            params.dataList.clear();            params.dataList.addAll(dataList);            return this;        }        public Builder setTitle(String title) {            params.title = title;            return this;        }        public Builder setUnit(String unit) {            params.unit = unit;            return this;        }        public Builder setSelection(int selection) {            params.initSelection = selection;            return this;        }        public Builder setOnDataSelectedListener(OnDataSelectedListener onDataSelectedListener) {            params.callback = onDataSelectedListener;            return this;        }        public DataPickerDialog create() {            final DataPickerDialog dialog = new DataPickerDialog(context, params.shadow ? R.style.Theme_Light_NoTitle_Dialog : R.style.Theme_Light_NoTitle_NoShadow_Dialog);            View view = LayoutInflater.from(context).inflate(R.layout.layout_picker_data, null);            if (!TextUtils.isEmpty(params.title)) {                TextView txTitle = (TextView) view.findViewById(R.id.tx_title);                txTitle.setText(params.title);                txTitle.setOnClickListener(new View.OnClickListener() {                    @Override                    public void onClick(View view) {                        dialog.dismiss();                        params.callback.onCancel();                    }                });            }            if (!TextUtils.isEmpty(params.unit)) {                TextView txUnit = (TextView) view.findViewById(R.id.tx_unit);                txUnit.setText(params.unit);            }            final LoopView loopData = (LoopView) view.findViewById(R.id.loop_data);            loopData.setArrayList(params.dataList);            loopData.setNotLoop();            if (params.dataList.size() > 0) loopData.setCurrentItem(params.initSelection);            view.findViewById(R.id.tx_finish).setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    dialog.dismiss();                    params.callback.onDataSelected(getCurrDateValue(),loopData.getCurrentItem());                }            });            Window win = dialog.getWindow();            win.getDecorView().setPadding(0, 0, 0, 0);            WindowManager.LayoutParams lp = win.getAttributes();            lp.width = WindowManager.LayoutParams.MATCH_PARENT;            lp.height = WindowManager.LayoutParams.WRAP_CONTENT;            win.setAttributes(lp);            win.setGravity(Gravity.BOTTOM);            win.setWindowAnimations(R.style.Animation_Bottom_Rising);            dialog.setContentView(view);            dialog.setCanceledOnTouchOutside(params.canCancel);            dialog.setCancelable(params.canCancel);            params.loopData = loopData;            dialog.setParams(params);            return dialog;        }    }}
DatePickerDialog
public class DatePickerDialog extends Dialog {    private static  int MIN_YEAR = 1900;    private static  int MAX_YEAR = 2100;    private Params params;    public DatePickerDialog(Context context, int themeResId) {        super(context, themeResId);    }    private void setParams(DatePickerDialog.Params params) {        this.params = params;    }    public interface OnDateSelectedListener {         void onDateSelected(int[] dates);         void onCancel();    }    private static final class Params {        private boolean shadow = true;        private boolean canCancel = true;        private LoopView loopYear, loopMonth, loopDay;        private OnDateSelectedListener callback;    }    public static class Builder {        private final Context context;        private final DatePickerDialog.Params params;        private Integer minYear;        private Integer maxYear;        private Integer selectYear;        private Integer selectMonth;        private Integer selectDay;        private Integer minMonth;        private Integer maxMonth;        private Integer minDay;        private Integer maxDay;        public Builder(Context context) {            this.context = context;            params = new DatePickerDialog.Params();        }        public Builder setMinYear(int year){            minYear=year;            return this;        }        public Builder setMaxYear(int year){            maxYear=year;            return this;        }        public Builder setMinMonth(int month){            minMonth=month;            return this;        }        public Builder setMaxMonth(int month){            maxMonth=month;            return this;        }        public Builder setMinDay(int day){            minDay=day;            return this;        }        public Builder setMaxDay(int day){            maxDay=day;            return this;        }        public Builder setSelectYear(int year){            this.selectYear=year;            return this;        }        public Builder setSelectMonth(int month){            this.selectMonth=month;            return this;        }        public Builder setSelectDay(int day){            this.selectDay=day;            return this;        }        /**         * 获取当前选择的日期         *         * @return int[]数组形式返回。例[1990,6,15]         */        private final int[] getCurrDateValues() {            int currYear = Integer.parseInt(params.loopYear.getCurrentItemValue());            int currMonth = Integer.parseInt(params.loopMonth.getCurrentItemValue());            int currDay = Integer.parseInt(params.loopDay.getCurrentItemValue());            return new int[]{currYear, currMonth, currDay};        }        public Builder setOnDateSelectedListener(OnDateSelectedListener onDateSelectedListener) {            params.callback = onDateSelectedListener;            return this;        }        public DatePickerDialog create() {            final DatePickerDialog dialog = new DatePickerDialog(context, params.shadow ? R.style.Theme_Light_NoTitle_Dialog : R.style.Theme_Light_NoTitle_NoShadow_Dialog);            View view = LayoutInflater.from(context).inflate(R.layout.layout_picker_date, null);            view.findViewById(R.id.tv_cancel).setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View view) {                    dialog.dismiss();                    params.callback.onCancel();                }            });            Calendar c = Calendar.getInstance();            final LoopView loopDay = (LoopView) view.findViewById(R.id.loop_day);            loopDay.setArrayList(d(1, 30));            if(selectDay!=null){                loopDay.setCurrentItem(selectDay);            }else{                loopDay.setCurrentItem(c.get(Calendar.DATE));            }            //loopDay.setNotLoop();            final LoopView loopYear = (LoopView) view.findViewById(R.id.loop_year);            loopYear.setArrayList(d(MIN_YEAR, MAX_YEAR - MIN_YEAR + 1));            if(selectYear!=null){                loopYear.setCurrentItem(selectYear-MIN_YEAR+1);            }else{                loopYear.setCurrentItem(MAX_YEAR);            }            loopYear.setNotLoop();            final LoopView loopMonth = (LoopView) view.findViewById(R.id.loop_month);            loopMonth.setArrayList(d(1, 12));            if(selectMonth!=null){                loopMonth.setCurrentItem(selectMonth);            }else{                loopMonth.setCurrentItem(c.get(Calendar.MONTH));            }            loopMonth.setNotLoop();            final LoopListener maxDaySyncListener = new LoopListener() {                @Override                public void onItemSelect(int item) {                    Calendar c = Calendar.getInstance();                    boolean needFixed=true;                    if(minYear!=null){                        if(Integer.parseInt(loopYear.getCurrentItemValue())==minYear ){                            if(minMonth!=null){                                if(Integer.parseInt(loopMonth.getCurrentItemValue())<minMonth){                                    loopMonth.setCurrentItem(minMonth - 1);                                }                            }                        }else if(Integer.parseInt(loopYear.getCurrentItemValue())<minYear){                            loopYear.setCurrentItem(minYear-MIN_YEAR);                        }                    }                    if(maxYear!=null){                        if(Integer.parseInt(loopYear.getCurrentItemValue())==maxYear ){                            if(maxMonth!=null){                                if(Integer.parseInt(loopMonth.getCurrentItemValue())>maxMonth){                                    loopMonth.setCurrentItem(maxMonth - 1);                                }                            }                        }else if(Integer.parseInt(loopYear.getCurrentItemValue())>maxYear){                            loopYear.setCurrentItem(maxYear-MIN_YEAR);                        }                    }                    c.set(Integer.parseInt(loopYear.getCurrentItemValue()), Integer.parseInt(loopMonth.getCurrentItemValue()) - 1, 1);                    c.roll(Calendar.DATE, false);                    if(needFixed){                        int maxDayOfMonth = c.get(Calendar.DATE);                        int fixedCurr = loopDay.getCurrentItem();                        loopDay.setArrayList(d(1, maxDayOfMonth));                        // 修正被选中的日期最大值                        if (fixedCurr > maxDayOfMonth) fixedCurr = maxDayOfMonth - 1;                        loopDay.setCurrentItem(fixedCurr);                    }                }            };            final LoopListener dayLoopListener=new LoopListener() {                @Override                public void onItemSelect(int item) {                    if(minYear!=null && minMonth!=null && minDay!=null                            && Integer.parseInt(loopYear.getCurrentItemValue())==minYear                            && Integer.parseInt(loopMonth.getCurrentItemValue())==minMonth                            && Integer.parseInt(loopDay.getCurrentItemValue())<minDay                            ){                        loopDay.setCurrentItem(minDay-1);                    }                    if(maxYear!=null && maxMonth!=null && maxDay!=null                            && Integer.parseInt(loopYear.getCurrentItemValue())==maxYear                            && Integer.parseInt(loopMonth.getCurrentItemValue())==maxMonth                            && Integer.parseInt(loopDay.getCurrentItemValue())>maxDay                            ){                        loopDay.setCurrentItem(maxDay-1);                    }                }            };            loopYear.setListener(maxDaySyncListener);            loopMonth.setListener(maxDaySyncListener);            loopDay.setListener(dayLoopListener);            view.findViewById(R.id.tx_finish).setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    dialog.dismiss();                    params.callback.onDateSelected(getCurrDateValues());                }            });            Window win = dialog.getWindow();            win.getDecorView().setPadding(0, 0, 0, 0);            WindowManager.LayoutParams lp = win.getAttributes();            lp.width = WindowManager.LayoutParams.MATCH_PARENT;            lp.height = WindowManager.LayoutParams.WRAP_CONTENT;            win.setAttributes(lp);            win.setGravity(Gravity.BOTTOM);            win.setWindowAnimations(R.style.Animation_Bottom_Rising);            dialog.setContentView(view);            dialog.setCanceledOnTouchOutside(params.canCancel);            dialog.setCancelable(params.canCancel);            params.loopYear = loopYear;            params.loopMonth = loopMonth;            params.loopDay = loopDay;            dialog.setParams(params);            return dialog;        }        /**         * 将数字传化为集合,并且补充0         *         * @param startNum 数字起点         * @param count    数字个数         * @return         */        private static List<String> d(int startNum, int count) {            String[] values = new String[count];            for (int i = startNum; i < startNum + count; i++) {                String tempValue = (i < 10 ? "0" : "") + i;                values[i - startNum] = tempValue;            }            return Arrays.asList(values);        }    }}

代码太多就不一一贴出来了,有需要直接下载完整demo 地址如下 百度网盘

http://pan.baidu.com/s/1bpCO7Np





原创粉丝点击