从早期的时候就比较喜欢拉框架直接用,所以之前记录了很多三方框架,该篇记录的就是其中较早期一款地址选择器三方框架
不知不觉过了这么久,最开始用 CityPicker 框架的时候还是2017年,但是现在(2022)可能发生了一些改变,扩展性也比以前强了;故建议如果要使用该框架的话,需要去了解 最新使用方法 ~
关联Blog
- Citypicker 五分钟内快速实现地址选择器(2017.05)
- 仿京东地址选择器使用指南 (2017.07)
- AndroidPicker 快速实现多样化日期选择器与地址选择器(2017.11)
- 通过 WheelView 实现一批专属自定义选择器 (2022.10)
因为之前的效果图被官方转存后效果缺失,同时因为有可能新人还会看到,故抽时间重新写了个小Demo,以防误导他人
实现效果
2017
早以前的git图,被转存成静态jpg了,无语中…
2023
Tip:为防止转存失效,直接放静态图了
Demo - Log输出
CityPicker 2017
Tip:因为写这篇Blog的时候比较早,所以很多对应的API可能被废弃和更改... 建议看2022、2023
基础概要
API注明
方法 | 含义 |
---|---|
textSize | 滚轮文字的大小,int 类型,默认为18 |
title | 选择器标题,默认为“选择地区” |
backgroundPop | 背景,默认为半透明,16位进制颜色代码,带alpha值,如0xa0ffffff |
titleBackgroundColor | 标题栏背景,默认为灰色,#C7C7C7 |
confirTextColor | 确认按钮字体颜色,默认为系统的colorPrimary颜色值 |
cancelTextColor | 取消按钮字体颜色,默认为系统的colorPrimary颜色值 |
province | 默认的显示省份,显示选择器后直接定位的item位置 |
city | 默认的显示市,显示选择器后直接定位的item位置 |
district | 默认的显示区,显示选择器后直接定位的item位置 |
textColor | 滚轮文字的颜色 ,int 类型,默认为0xFF585858 |
provinceCyclic | 省份的滚轮是否循环滚动 |
cityCyclic | 市的滚轮是否循环滚动 |
districtCyclic | 区的滚轮是否循环滚动 |
visibleItemsCount | 滚轮显示的item个数,int 类型,默认为5个 |
itemPadding | 滚轮item间距,默认为5dp |
onlyShowProvinceAndCity(boolean flag) | 是否只显示省份和市的两级联动,去掉区或者县 |
titleTextColor | (标题文字颜色,默认为 #E9E9E9) |
回调结果
只需传入Context便可获取选择的省市区域的信息,结果返回四项,可根据自己的实际需求进行选择。
回调 | 含义 |
---|---|
citySelected[0] | 省份信息 |
citySelected[1] | 城市信息 |
citySelected[2] | 区县信息 |
citySelected[3] | 邮编信息 |
开发实践
- build引用(
2017的版本,2022我去看了下 版本已经到6.0.2了,所以最好去看原作者的使用方式
)
compile 'liji.library.dev:citypickerview:0.7.0'
- MainActivity
package com.example.dow.citypickerview;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import com.lljjcoder.citypickerview.widget.CityPicker;
public class MainActivity extends AppCompatActivity {
private TextView mContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView mBtn = (TextView) findViewById(R.id.tv_btn);
mContent = (TextView) findViewById(R.id.tv_content);
mBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getAddress();
}
});
}
private void getAddress() {
CityPicker cityPicker=new CityPicker.Builder(MainActivity.this)
.textSize(14)
.title("地址选择")
.titleBackgroundColor("#FFFFFF")
.confirTextColor("#696969")
.cancelTextColor("#696969")
.province("江苏省")
.city("常州市")
.district("天宁区")
.textColor(Color.parseColor("#000000"))
.provinceCyclic(true)
.cityCyclic(false)
.districtCyclic(false)
.visibleItemsCount(7)
.itemPadding(10)
.onlyShowProvinceAndCity(false)
.build();
cityPicker.show();
//监听事件,获取结果
cityPicker.setOnCityItemClickListener(new CityPicker.OnCityItemClickListener() {
@Override
public void onSelected(String... citySelected) {
//省份
String province = citySelected[0];
//城市
String city =citySelected[1];
//区县(如果设定了两级联动,那么该项返回空)
String district = citySelected[2];
//邮编
String code = citySelected[3];
//为展示区赋值
mContent.setText(province.trim() + "-" + city.trim() + "-" + district.trim());
}
});
}
}
- 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:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.dow.citypickerview.MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_btn"
android:gravity="center"
android:padding="5dp"
android:text="地址选择器" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tv_content"
android:gravity="center"
android:padding="5dp"
/>
</LinearLayout>
CityPicker 2022、2023
早前单独集成过类似 仿京东地址选择器 ,后来发现这款三方框架也开发了对应的功能,不过该处就不另做解释了
关于自定义弹框的可配属性(自定义属性),可直接到对应的 Config
查看,下图为例
集成基础版 样式一(仿iOS滚轮实现),发现些问题
AndroidManifest
中application
的theme 必须为AppTheme 或 继承于AppTheme的Theme
- 弹框的样式并
未适配多行样式,会出现字体挤压的情况
看到有一个相对实用的功能,就是自定义省市区资源,有兴趣的话可以参考 样式一(仿iOS滚轮实现)自定义数据源
开发实践
buidle.gradle(app)
加依赖
implementation 'com.github.crazyandcoder:citypicker:6.0.2'
过程解析
主要有几个过程,如嫌繁琐,也可直接去看下面的 全量代码
- 控件、地址数据初始化
class MainActivity : AppCompatActivity() {
private var mPicker: CityPickerView = CityPickerView()
@SuppressLint("MissingInflatedId")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var pickerView: TextView = findViewById(R.id.tv_picker)
pickerView.setOnClickListener {
mPicker.showCityPicker()
}
//预先加载仿iOS滚轮实现的全部数据
mPicker.init(this);
}
}
- 可自定义一些默认配置
//添加默认的配置,不需要自己定义,当然也可以自定义相关熟悉,详细属性请看demo
//val cityConfig = CityConfig.Builder().build()
//随机配点默认属性
var cityConfig = CityConfig.Builder()
.title("地址选择")
.titleBackgroundColor("#FFFFFF")
.confirTextColor("#696969")
.cancelTextColor("#696969")
.province("上海市")
.city("上海市")
.district("浦东新区")
.provinceCyclic(true)
.cityCyclic(false)
.districtCyclic(false)
.visibleItemsCount(7)
.build()
mPicker.setConfig(cityConfig)
- 回调监听,获取选择器数据、状态
//监听选择点击事件及返回结果
mPicker.setOnCityItemClickListener(object : OnCityItemClickListener() {
override fun onSelected(province: ProvinceBean?, city: CityBean?, district: DistrictBean?) {
//省份province
Log.e("bean", province?.name.toString())
//城市city
Log.e("bean", city?.name.toString())
//地区district
Log.e("bean", district?.name.toString())
}
override fun onCancel() {
Log.e("bean", "已取消")
}
})
全量代码
MainActivity
package com.example.ktdemo
import android.annotation.SuppressLint
import android.os.Bundle
import android.util.Log
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.lljjcoder.Interface.OnCityItemClickListener
import com.lljjcoder.bean.CityBean
import com.lljjcoder.bean.DistrictBean
import com.lljjcoder.bean.ProvinceBean
import com.lljjcoder.citywheel.CityConfig
import com.lljjcoder.style.citypickerview.CityPickerView
class MainActivity : AppCompatActivity() {
private var mPicker: CityPickerView = CityPickerView()
@SuppressLint("MissingInflatedId")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//调用
var pickerView: TextView = findViewById(R.id.tv_picker)
pickerView.setOnClickListener {
mPicker.showCityPicker()
}
//预先加载仿iOS滚轮实现的全部数据
mPicker.init(this);
//添加默认的配置,不需要自己定义,当然也可以自定义相关熟悉,详细属性请看demo
//val cityConfig = CityConfig.Builder().build()
//随机配点默认属性
var cityConfig = CityConfig.Builder()
.title("地址选择")
.titleBackgroundColor("#FFFFFF")
.confirTextColor("#696969")
.cancelTextColor("#696969")
.province("上海市")
.city("上海市")
.district("浦东新区")
.provinceCyclic(true)
.cityCyclic(false)
.districtCyclic(false)
.visibleItemsCount(7)
.build()
mPicker.setConfig(cityConfig)
//监听选择点击事件及返回结果
mPicker.setOnCityItemClickListener(object : OnCityItemClickListener() {
override fun onSelected(province: ProvinceBean?, city: CityBean?, district: DistrictBean?) {
//省份province
Log.e("bean", province?.name.toString())
//城市city
Log.e("bean", city?.name.toString())
//地区district
Log.e("bean", district?.name.toString())
}
override fun onCancel() {
Log.e("bean", "已取消")
}
})
}
}
activity_main
<?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=".MainActivity">
<TextView
android:id="@+id/tv_picker"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="CityPicker"
android:textColor="#333333"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>