Android进阶之路 - AndroidPicker快速实现多样化日期选择器与地址选择器
2017-11-14 15:03
615 查看
日期选择器,项目中不少用,网上也有很多,包括我之前也写过一个,但是没有这个漂亮,毕竟我也是在进步嘛,这次使用的三方框架为AndroidPicker,一开始看了几篇文章介绍,包括作者介绍的使用方式都不得其解,好在最后是解决了,同时简单封装了一下,大家请直接看下文把。
Effect :
准备工作(如使用中出现错误,请看最后的错误点提醒)
build 引入
插入动画
1.res文件下创建anim文件夹
popup_in.xml :
popup_out.xml :
2.value下的style内封装动画style
正式阶段
DateListener(使用此接口传输数据 - 接口回调):
MainActivity :
MainActivity Xml:
DateUtil (简单封装,方便使用):
注明 :
1.使用 地址选择器时,需要在 assets 文件夹下加入 “city.json”
city.json地址
2.因为要数据回调,需要一个接口 :
错误提示 :
如出现 Error:Execution failed for task ‘:app:processDebugManifest’. > Manifest merger failed with
build :
同时修改DateUtil内的 DateTimePicker 为 DatePicker(可参考此处)
此Demo下载地址
原作者git地址
借鉴文章 - 1
借鉴文章 - 2
借鉴文章 - 3
Effect :
准备工作(如使用中出现错误,请看最后的错误点提醒)
build 引入
compile 'cn.qqtheme.framework:WheelPicker:latest.integration'
插入动画
1.res文件下创建anim文件夹
popup_in.xml :
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="500" android:fromYDelta="100%p" android:toYDelta="0" /> <alpha android:duration="500" android:fromAlpha="0" android:toAlpha="1" /> </set>
popup_out.xml :
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="1000" android:fromYDelta="0" android:toYDelta="50%p" /> <alpha android:duration="500" android:fromAlpha="1" android:toAlpha="0" /> </set>
2.value下的style内封装动画style
<style name="Animation_CustomPopup" parent="@android:style/Animation"> <item name="android:windowEnterAnimation">@anim/popup_in</item> <item name="android:windowExitAnimation">@anim/popup_out</item> </style>
正式阶段
DateListener(使用此接口传输数据 - 接口回调):
package com.bakheet.effect.picker; /** * @author by YongLiu on 2017/11/14. */ public interface DateListener { void setYear(String year); void setMonth(String month); void setDay(String day); void setMouthDate(String year, String month); void setYearDate(String year, String month, String day); }
MainActivity :
package com.bakheet.effect.picker; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends AppCompatActivity { private TextView mContent; private TextView mBtn; private TextView mBtnMonth; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mBtn = (TextView) findViewById(R.id.btn); mContent = (TextView) findViewById(R.id.content); mBtnMonth = (TextView) findViewById(R.id.btn_month); /** * 年月日 * */ mBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DateUtil.setYearDate(MainActivity.this, new DateListener() { @Override public void setYear(String year) { } @Override public void setMonth(String month) { } @Override public void setDay(String day) { } @Override public void setMouthDate(String year, String month) { } @Override public void setYearDate(String year, String month, String day) { mContent.setText(year + "-" + month + "-" + day); } }); } }); /** * 年月 * */ mBtnMonth.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { DateUtil.setMonthDate(MainActivity.this, new DateListener() { @Override public void setYear(String year) { } @Override public void setMonth(String month) { } @Override public void setDay(String day) { } @Override public void setMouthDate(String year, String month) { mContent.setText(year + "-" + month); } @Override public void setYearDate(String year, String month, String day) { } }); } }); } }
MainActivity Xml:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.bakheet.effect.picker.MainActivity"> <TextView android:id="@+id/btn" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="8dp" android:text="弹出日期框 - 年月" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="@color/colorPrimaryDark" /> <TextView android:id="@+id/btn_month" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="8dp" android:text="弹出日期框 - 年月日" /> <View android:layout_width="match_parent" android:layout_height="2dp" android:background="@color/colorPrimaryDark" /> <TextView android:id="@+id/content" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center" android:gravity="center" android:text="日期展示区" /> </LinearLayout>
DateUtil (简单封装,方便使用):
package com.bakheet.effect.picker; import android.app.Activity; import android.text.format.Time; import cn.qqtheme.framework.picker.DatePicker; import cn.qqtheme.framework.picker.DateTimePicker; /** * Created by YongLiu on 2017/11/14. * @author */ public class DateUtil { /** * 年-月 */ static void setMonthDate(final Activity mContext,final DateListener dateListener){ DatePicker picker = new DatePicker(mContext, DateTimePicker.YEAR_MONTH); //获取当前时间 Time time = new Time(); time.setToNow(); int year = time.year; int month = time.month; //设置时间区间 picker.setRange(2000,2020); //设置默认显示时间 picker.setSelectedItem(year,month+1); //加入动画 picker.setAnimationStyle(R.style.Animation_CustomPopup); //回传数据 picker.setOnDatePickListener(new DatePicker.OnYearMonthPickListener() { @Override public void onDatePicked(String year, String month) { dateListener.setMouthDate(year,month); } }); picker.show(); } /** * 年-月-日 */ static void setYearDate(final Activity mContext,final DateListener dateListener){ DatePicker picker = new DatePicker(mContext); //获取当前时间 Time time = new Time(); time.setToNow(); int year = time.year; int month = time.month; int monthDay = time.monthDay; //设置时间区间 picker.setRange(2000,2020); //设置默认显示时间 picker.setSelectedItem(year,month+1,monthDay); //加入动画 picker.setAnimationStyle(R.style.Animation_CustomPopup); //回传数据 picker.setOnDatePickListener(new DatePicker.OnYearMonthDayPickListener() { @Override public void onDatePicked(String year, String month, String day) { dateListener.setYearDate(year,month,day); } }); picker.show(); } /** * 年-月 最后可选日期为当日 */ public static void setMonthDate(final Activity mContext, String startYear, String startMonth, boolean dynamicStartTime, final DateListener dateListener) { DatePicker picker = new DatePicker(mContext, DatePicker.YEAR_MONTH); //获取当前时间 Time time = new Time(); time.setToNow(); int currentYear = time.year; int currentMonth = time.month; TLogUtils.e("currentMonth =" + currentMonth); //设置时间区间 if (dynamicStartTime) { //动态的开始时间 picker.setRangeStart(ToolUtil.getIntParseString(startYear), ToolUtil.getIntParseString(startMonth)); picker.setRangeEnd(2050, 1); } else { //动态的结束时间 picker.setRangeStart(2000, 1); picker.setRangeEnd(currentYear, currentMonth + 1); } //设置时间区间 // picker.setRange(2000, year); //循环 // picker.setCycleDisable(false); //设置默认显示时间 picker.setSelectedItem(currentYear, currentMonth + 1); //加入动画 picker.setAnimationStyle(R.style.Animation_CustomPopup); //设置取消按钮文字颜色 picker.setCancelTextColor(ContextCompat.getColor(mContext, R.color.gray1)); //设置取消按钮文字大小 picker.setCancelTextSize(14); //设置顶部标题栏下划线颜色 picker.setTopLineColor(ContextCompat.getColor(mContext, R.color.white1)); //设置分割线颜色 picker.setDividerColor(ContextCompat.getColor(mContext, R.color.white1)); //设置确定按钮文字颜色 picker.setSubmitTextColor(ContextCompat.getColor(mContext, R.color.blue2)); picker.setTextColor(ContextCompat.getColor(mContext, R.color.blue2)); picker.setSubmitTextSize(14); //设置标题文字颜色 picker.setTitleTextColor(ContextCompat.getColor(mContext, R.color.gray5)); //设置标题文字 picker.setTitleText("选择月份"); //设置标题文字大小 picker.setTitleTextSize(14); //回传数据 picker.setOnDatePickListener(new DatePicker.OnYearMonthPickListener() { @Override public void onDatePicked(String year, String month) { dateListener.setMouthDate(year, month); } }); picker.show(); } } /** * 选择税率 - 偏向自定义样式 */ public static void setRate(final Activity mContext, OptionPicker.OnOptionPickListener onOptionPickListener) { String[] strings = {"0%", "3%", "17%"}; OptionPicker picker = new OptionPicker(mContext, strings); picker.setSelectedIndex(0); picker.setTextSize(22); picker.setItemWidth(160); //设置取消按钮文字颜色 picker.setCancelTextColor(ContextCompat.getColor(mContext, R.color.gray1)); //设置取消按钮文字大小 picker.setCancelTextSize(14); //设置顶部标题栏下划线颜色 picker.setTopLineColor(ContextCompat.getColor(mContext, R.color.white1)); //设置分割线颜色 picker.setDividerColor(ContextCompat.getColor(mContext, R.color.white1)); //设置确定按钮文字颜色 picker.setSubmitTextColor(ContextCompat.getColor(mContext, R.color.blue2)); picker.setTextColor(ContextCompat.getColor(mContext, R.color.blue2)); picker.setSubmitTextSize(14); //设置标题文字颜色 picker.setTitleTextColor(ContextCompat.getColor(mContext, R.color.gray5)); //设置标题文字 picker.setTitleText("选择税率"); //设置标题文字大小 picker.setTitleTextSize(14); picker.setOnOptionPickListener(onOptionPickListener); picker.show(); } /** * 地址 - 因为加载本地的json文件,所以有时候会有一些卡顿 */ public static void setPlace(Activity mContext, final PlaceListener placeListener) { ArrayList<Province> data = new ArrayList<>(); String json = AssetsUtils.getStringFromAssert(mContext, "city.json"); data.addAll(JSON.parseArray(json, Province.class)); AddressPicker picker = new AddressPicker(mContext, data); picker.setSelectedItem("上海", "上海市", "浦东新区"); //设置取消按钮文字颜色 picker.setCancelTextColor(ContextCompat.getColor(mContext, R.color.gray1)); //设置取消按钮文字大小 picker.setCancelTextSize(14); //设置顶部标题栏下划线颜色 picker.setTopLineColor(ContextCompat.getColor(mContext, R.color.white1)); //设置分割线颜色 picker.setDividerColor(ContextCompat.getColor(mContext, R.color.white1)); //设置确定按钮文字颜色 picker.setSubmitTextColor(ContextCompat.getColor(mContext, R.color.blue2)); picker.setTextColor(ContextCompat.getColor(mContext, R.color.blue2)); picker.setSubmitTextSize(14); //设置标题文字颜色 picker.setTitleTextColor(ContextCompat.getColor(mContext, R.color.gray5)); //设置标题文字 picker.setTitleText("选择城市区域"); //设置标题文字大小 picker.setTitleTextSize(14); picker.setOnAddressPickListener(new AddressPicker.OnAddressPickListener() { @Override public void onAddressPicked(Province province, City city, County county) { placeListener.setProvince(province.getAreaName()); //城市 placeListener.setCity(city.getAreaName()); //区县(如果设定了两级联动,那么该项返回空) placeListener.setDistrict(county.getAreaName()); //全部地址 placeListener.setAllPlace(province.getAreaName() + " " + city.getAreaName() + " " + county.getAreaName()); } }); picker.show(); }
注明 :
1.使用 地址选择器时,需要在 assets 文件夹下加入 “city.json”
city.json地址
2.因为要数据回调,需要一个接口 :
package com.bakheet.garage.mine.listener; /** * author YongLiu * date 2017/12/14. * desc: */ public interface PlaceListener { void setProvince(String province); void setCity(String city); void setDistrict(String district); void setAllPlace(String allPlace); }
错误提示 :
如出现 Error:Execution failed for task ‘:app:processDebugManifest’. > Manifest merger failed with
build :
//注释framework:WheelPicker:latest这个引用,引用下方新的AndroidPicker //compile 'cn.qqtheme.framework:WheelPicker:latest.integration' compile 'cn.qqtheme.framework:AndroidPicker:latest.integration'
同时修改DateUtil内的 DateTimePicker 为 DatePicker(可参考此处)
此Demo下载地址
原作者git地址
借鉴文章 - 1
借鉴文章 - 2
借鉴文章 - 3
相关文章推荐
- Android进阶之路 - 五分钟内快速实现地址选择器(citypicker )
- AndroidPicker: 安卓选择器类库,包括日期时间选择器、单项选择器、地址选择器、颜色选择器、文件目录选择器、数字选择器、星座选择器等
- Android进阶之路 - timeSelector(日期选择器)简单、方便、快速的实现方式
- Android中实现日期时间选择器(DatePicker和TimePicker)
- Android选择器类库,包括日期时间选择器、单项选择器、地址选择器、颜色选择器、文件目录选择器、数字选择器、星座选择器等
- Android选择器类库,包括日期时间选择器、单项选择器、地址选择器、颜色选择器、文件目录选择器、数字选择器、星座选择器等
- Android中实现日期时间选择器(DatePicker和TimePicker)
- android—DatePicker 和TimePicker显示日期以及使用TimePickerDialog,DatePickerDialog来专门实现时间选择对话框
- Android中实现日期时间选择器(DatePicker和TimePicker)
- Android中实现日期时间选择器(DatePicker和TimePicker)
- Android中实现日期时间选择器(DatePicker和TimePicker)
- Android中实现日期时间选择器(DatePicker和TimePicker)
- 在Android EditText中实现日期时间选择器(DatePicker和TimePicker)
- Android 日期选择器、日期范围选择器:MaterialDateRangePicker
- android 实现点击输入框弹出日期选择对话框(DatePickerDialog)
- Android中日期选择器与时间选择器的实现
- Android DatePicker日期选择器、TimePicker时间选择器的使用
- Android_日期选择器DatePickerDialog、时间选择器TimePickerDialog
- Android中实现日期时间选择器(DatePicker和TimePicker)
- 使用Android-PickerView实现地址选择器时间选择器