亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android仿ios年齡、生日、性別滾輪效果

2019-10-21 21:34:43
字體:
來源:轉載
供稿:網友

新項目Androidios要做成統一樣式,年齡,性別,時間,要做成滾輪效果,Android沒有原生控件,只能自己定義,于是我較勁腦汁,終于寫出來,本著分享精神,貼出部分代碼,直接拷貝就能用。

先看效果圖,如果符合你的需求,再采納

時間

Android,ios,滾輪

年齡

Android,ios,滾輪

性別

Android,ios,滾輪

廢話不多說,直接上代碼

布局

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地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费在线观看| 亚洲国产日韩欧美综合久久| 成人黄色免费网站在线观看| 国产精品普通话| 亚洲成人久久网| 国产精品第100页| 中文字幕久精品免费视频| 久久精品男人天堂| 久久国产精品久久国产精品| 成人免费观看网址| 性欧美激情精品| 亚洲视屏在线播放| 久热99视频在线观看| 色999日韩欧美国产| 日韩在线视频免费观看| 国产综合香蕉五月婷在线| 中文字幕国内精品| 久久精品99久久香蕉国产色戒| 免费91麻豆精品国产自产在线观看| 国产成人97精品免费看片| 精品国产依人香蕉在线精品| 亚洲新声在线观看| 久热爱精品视频线路一| 都市激情亚洲色图| 国产一区二区在线播放| 欧美国产在线电影| 狠狠躁18三区二区一区| 一区二区三区www| 亚洲精品98久久久久久中文字幕| www.欧美免费| 国产日韩视频在线观看| 午夜精品一区二区三区av| 亚洲日本欧美日韩高观看| 夜夜狂射影院欧美极品| 日韩美女免费视频| 久久久久久亚洲精品中文字幕| 亚洲小视频在线观看| 久久久亚洲影院| 国产一区二区三区日韩欧美| 精品视频在线播放色网色视频| 亚洲自拍欧美色图| 国产精品视频一区国模私拍| 亚洲a级在线观看| 91极品女神在线| 性欧美激情精品| 久久久国产91| 一本色道久久综合亚洲精品小说| 午夜精品视频在线| 欧美日韩一区二区三区在线免费观看| 欧美日韩激情小视频| 91精品视频一区| 欧美成人亚洲成人日韩成人| 国产精品免费一区豆花| 欧美色图在线视频| 最新国产精品亚洲| 国产在线视频一区| 亚洲精品综合久久中文字幕| 国产在线不卡精品| 色综合久久久久久中文网| 456国产精品| 亚洲а∨天堂久久精品喷水| 国产成人精彩在线视频九色| 国产精品偷伦免费视频观看的| 日本精品视频在线播放| 欧美激情一区二区三级高清视频| 久久精品国产视频| 亚洲国产精品悠悠久久琪琪| 国产精品免费一区二区三区都可以| 中文字幕精品www乱入免费视频| 日韩中文字幕免费视频| 欧美丰满少妇xxxxx做受| 欧美肥老太性生活视频| 国外色69视频在线观看| 国产精品激情av电影在线观看| 国产成人中文字幕| 亚洲欧美日韩视频一区| 亚洲欧美中文另类| 色综合天天狠天天透天天伊人| 国产日韩视频在线观看| 久久久久女教师免费一区| 丝袜亚洲另类欧美重口| 日韩av在线最新| 国产精品久久久久高潮| 91国语精品自产拍在线观看性色| 超碰日本道色综合久久综合| 国产精品视频26uuu| 欧美亚洲国产另类| 欧美乱大交xxxxx| 欧美精品videossex88| 成人黄色在线播放| 91欧美精品午夜性色福利在线| 一本色道久久88综合亚洲精品ⅰ| 久久青草福利网站| 久久亚洲精品国产亚洲老地址| 伊人久久久久久久久久久| 国产一区二区三区三区在线观看| 国产精品久久久久av| 亚洲精品一区二区在线| 国产精品一区二区电影| 成人黄色在线观看| 欧美成人免费在线视频| 日韩电影中文字幕一区| 亚洲成人av片在线观看| 在线视频日韩精品| 一区二区三区动漫| 欧美激情精品久久久久久免费印度| 国产偷亚洲偷欧美偷精品| 久久亚洲春色中文字幕| 成人午夜在线观看| 国产成人小视频在线观看| 98视频在线噜噜噜国产| 欧美综合在线观看| 2020久久国产精品| 国产+成+人+亚洲欧洲| 国产精品第一页在线| 欧美日韩免费在线观看| 久久青草精品视频免费观看| 九九久久久久久久久激情| 97香蕉超级碰碰久久免费软件| 中文字幕日韩精品在线| 中文欧美在线视频| 精品久久久精品| 久久精品夜夜夜夜夜久久| 国产精品视频一区国模私拍| 91在线视频九色| 欧美亚洲第一页| 欧美资源在线观看| 亚洲精品日韩av| 成人国产精品久久久| 日韩欧美在线看| 国产成+人+综合+亚洲欧美丁香花| 久久国产精品首页| 亚洲成人网在线| 亚洲aa在线观看| 欧美激情一级欧美精品| 姬川优奈aav一区二区| 亚洲欧美日韩综合| 国产一区二区三区精品久久久| 色偷偷偷综合中文字幕;dd| 亚洲人成伊人成综合网久久久| 亚洲视频网站在线观看| 欧美午夜影院在线视频| 成人久久久久久久| 日韩最新在线视频| 欧美精品久久久久久久久| 欧美日韩国产页| 久久人人爽人人爽人人片亚洲| 日韩精品免费在线视频| 国产成人亚洲综合| 海角国产乱辈乱精品视频| 亚洲区一区二区| 日韩亚洲国产中文字幕| 欧美精品成人91久久久久久久| 91香蕉国产在线观看| 精品中文视频在线| 亚洲精品久久久久中文字幕欢迎你| 在线电影欧美日韩一区二区私密| 日韩av最新在线观看| 91影院在线免费观看视频| 久久久久久国产精品久久| 91精品国产91| 欧美老妇交乱视频| 日本久久久久久久| 2021国产精品视频|