因为现在项目的地址选择器比较low,自己又比较懒,所以就找到了
仿京东的地址选择器
,观赏几篇博文之后,发现总是被半路卡死,很难一路走到底,所以在github找到了项目地址,但是作者的功能简介又介绍的不是很详细
,总会有一些小的知识点遗漏,到了最后只能非常无奈的查看了源代码,然后实现了自己的功能所需,一些小坑在下方列出,请君观赏。
关联Blog
- Citypicker 五分钟内快速实现地址选择器(2017.05)
- 仿京东地址选择器使用指南 (2017.07)
- AndroidPicker 快速实现多样化日期选择器与地址选择器(2017.11)
- 通过 WheelView 实现一批专属自定义选择器 (2022.10)
当年全屏页面选择器样式比较潮流,时过境迁已不太受众了
基础概要
Tip 小坑
- 文中的效果有
俩种展现方式
- 第一种是将
自定义添加到Linearlayout布局
- 第二种是以
弹框形式
展示
- 第一种是将
- 因作者
原始自定义BottomDialog的整体展示不太美观
,而代码又限制只有读的权限,故重写了一份BottomDialog
,设置了符合自己观赏的BottomDialog
- android中存在一些
自定义color
,使用android.R.color.holo_orange_light
进行引用
需掌握知识点
- 接口回调
RecyclerView
、ListView
相关使用- 自定义
Dialog
Effect
早以前都是Git动态图,后面都被官方转存成jpg,略表无奈
第一种
第二种
实践过程
原作者Github项目地址(框架较小众)
前置引入
build (project)
allprojects {
repositories {
jcenter()
//这个写不写都可以,我注释之后依旧可以正常使用
// maven { url 'https://jitpack.io' }
}
}
build (app)
compile 'com.smarttop:jd-address:1.1.0'
使用方式
MainActivity
package com.yl.select.addressselect;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.smarttop.library.bean.City;
import com.smarttop.library.bean.County;
import com.smarttop.library.bean.Province;
import com.smarttop.library.bean.Street;
import com.smarttop.library.db.manager.AddressDictManager;
import com.smarttop.library.utils.LogUtil;
import com.smarttop.library.widget.AddressSelector;
import com.smarttop.library.widget.OnAddressSelectedListener;
public class MainActivity extends AppCompatActivity implements View.OnClickListener, OnAddressSelectedListener, AddressSelector.OnDialogCloseListener {
private LinearLayout mViewcontent;
private TextView mSelectorContent;
private AddressDictManager addressDictManager;
private String provinceCode;
private String cityCode;
private String countyCode;
private String streetCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSelectorContent = (TextView) findViewById(R.id.tv_selector_area);
mViewcontent = (LinearLayout) findViewById(R.id.content);
AddressSelector selector = new AddressSelector(this);
mSelectorContent.setOnClickListener(this);
addressDictManager = selector.getAddressDictManager();
selector.setTextSize(13);
//设置指针颜色
selector.setIndicatorBackgroundColor(android.R.color.holo_orange_light);
//设置字体获得焦点的颜色
selector.setTextSelectedColor(android.R.color.holo_orange_light);
//设置字体没有获得焦点的颜色
selector.setTextUnSelectedColor(android.R.color.holo_blue_light);
//选择监听,用户选取中和选取完毕之后调用此方法
selector.setOnAddressSelectedListener(new OnAddressSelectedListener() {
@Override
public void onAddressSelected(Province province, City city, County county, Street street) {
String address = (province == null ? "" : province.name) + (city == null ? "" : city.name) + (county == null ? "" : county.name) +
(street == null ? "" : street.name);
// mSelectorContent.setVisibility(View.VISIBLE);
mSelectorContent.setText(address);
// mViewcontent.removeAllViews();
}
});
// 如将此处的注释放开,即可全屏显示一次
// View view = selector.getView();
// mViewcontent.addView(view);
// mSelectorContent.setVisibility(View.GONE);
}
private BottomDialog dialog;
@Override
public void onClick(View v) {
if (dialog != null) {
dialog.show();
} else {
dialog = new BottomDialog(this);
//地址选取监听
dialog.setOnAddressSelectedListener(this);
//Dialog监听
dialog.setDialogDismisListener(this);
//设置字体的大小
dialog.setTextSize(14);
//设置指示器的颜色
dialog.setIndicatorBackgroundColor(android.R.color.holo_orange_light);
//设置字体获得焦点的颜色
dialog.setTextSelectedColor(android.R.color.holo_orange_light);
//设置字体没有获得焦点的颜色
dialog.setTextUnSelectedColor(android.R.color.holo_blue_light);
dialog.show();
}
}
@Override
public void onAddressSelected(Province province, City city, County county, Street street) {
provinceCode = (province == null ? "" : province.code);
cityCode = (city == null ? "" : city.code);
countyCode = (county == null ? "" : county.code);
streetCode = (street == null ? "" : street.code);
String address = (province == null ? "" : province.name) + " " + (city == null ? "" : city.name) + " " + (county == null ? "" : county.name) + " " + (street == null ? "" : street.name);
mSelectorContent.setText("地址 :" + " " + address);
if (dialog != null) {
dialog.dismiss();
}
// getSelectedArea();
}
@Override
public void dialogclose() {
if (dialog != null) {
dialog.dismiss();
}
}
/**
* 根据code 来显示选择过的地区
*/
private void getSelectedArea() {
String province = addressDictManager.getProvince(provinceCode);
String city = addressDictManager.getCity(cityCode);
String county = addressDictManager.getCounty(countyCode);
String street = addressDictManager.getStreet(streetCode);
}
}
自定义BottomDialog(这里只修改了一下展示的高度)
package com.yl.select.addressselect;
import android.app.Dialog;
import android.content.Context;
import android.view.Gravity;
import android.view.Window;
import android.view.WindowManager;
import com.smarttop.library.utils.Dev;
import com.smarttop.library.widget.AddressSelector;
import com.smarttop.library.widget.OnAddressSelectedListener;
/**
* Created by YongLiu on 2017/7/26.
*/
public class BottomDialog extends Dialog {
private AddressSelector selector;
public BottomDialog(Context context) {
super(context, com.smarttop.library.R.style.bottom_dialog);
init(context);
}
public BottomDialog(Context context, int themeResId) {
super(context, themeResId);
init(context);
}
public BottomDialog(Context context, boolean cancelable, OnCancelListener cancelListener) {
super(context, cancelable, cancelListener);
init(context);
}
/**
* 初始化
*
* @param context
*/
private void init(Context context) {
selector = new AddressSelector(context);
setContentView(selector.getView());
Window window = getWindow();
WindowManager.LayoutParams params = window.getAttributes();
params.width = WindowManager.LayoutParams.MATCH_PARENT;
params.height = Dev.dp2px(context, 350);
window.setAttributes(params);
window.setGravity(Gravity.BOTTOM);
}
public void setOnAddressSelectedListener(OnAddressSelectedListener listener) {
this.selector.setOnAddressSelectedListener(listener);
}
public static BottomDialog show(Context context) {
return show(context, null);
}
public static BottomDialog show(Context context, OnAddressSelectedListener listener) {
BottomDialog dialog = new BottomDialog(context, com.smarttop.library.R.style.bottom_dialog);
dialog.selector.setOnAddressSelectedListener(listener);
dialog.show();
return dialog;
}
public void setDialogDismisListener(AddressSelector.OnDialogCloseListener listener){
this.selector.setOnDialogCloseListener(listener);
}
/**
*设置字体选中的颜色
*/
public void setTextSelectedColor(int selectedColor){
this.selector.setTextSelectedColor(selectedColor);
}
/**
*设置字体没有选中的颜色
*/
public void setTextUnSelectedColor(int unSelectedColor){
this.selector.setTextUnSelectedColor(unSelectedColor);
}
/**
* 设置字体的大小
*/
public void setTextSize(float dp){
this.selector.setTextSize(dp);
}
/**
* 设置字体的背景
*/
public void setBackgroundColor(int colorId){
this.selector.setBackgroundColor(colorId);
}
/**
* 设置指示器的背景
*/
public void setIndicatorBackgroundColor(int colorId){
this.selector.setIndicatorBackgroundColor(colorId);
}
/**
* 设置指示器的背景
*/
public void setIndicatorBackgroundColor(String color){
this.selector.setIndicatorBackgroundColor(color);
}
}
activity_main
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.yl.select.addressselect.MainActivity">
<TextView
android:layout_marginTop="20dp"
android:id="@+id/tv_selector_area"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:layout_gravity="center"
android:padding="10dp"
android:text="选择地区" />
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true">
</LinearLayout>
</LinearLayout>