您的位置:首页 > 移动开发 > Android开发

Android进阶之路 - AndroidPicker快速实现多样化日期选择器与地址选择器

2017-11-14 15:03 615 查看
日期选择器,项目中不少用,网上也有很多,包括我之前也写过一个,但是没有这个漂亮,毕竟我也是在进步嘛,这次使用的三方框架为AndroidPicker,一开始看了几篇文章介绍,包括作者介绍的使用方式都不得其解,好在最后是解决了,同时简单封装了一下,大家请直接看下文把。

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐