Android进阶之路 - Citypicker 五分钟内快速实现地址选择器

从早期的时候就比较喜欢拉框架直接用,所以之前记录了很多三方框架,该篇记录的就是其中较早期一款地址选择器三方框架

不知不觉过了这么久,最开始用 CityPicker 框架的时候还是2017年,但是现在(2022)可能发生了一些改变,扩展性也比以前强了;故建议如果要使用该框架的话,需要去了解 最新使用方法 ~

关联Blog

因为之前的效果图被官方转存后效果缺失,同时因为有可能新人还会看到,故抽时间重新写了个小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滚轮实现),发现些问题

  • AndroidManifestapplicationtheme 必须为AppTheme 或 继承于AppTheme的Theme
  • 弹框的样式并未适配多行样式,会出现字体挤压的情况

看到有一个相对实用的功能,就是自定义省市区资源,有兴趣的话可以参考 样式一(仿iOS滚轮实现)自定义数据源

开发实践

buidle.gradle(app)加依赖

   implementation 'com.github.crazyandcoder:citypicker:6.0.2'
过程解析

主要有几个过程,如嫌繁琐,也可直接去看下面的 全量代码

  1. 控件、地址数据初始化
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);
    }
}
  1. 可自定义一些默认配置
        //添加默认的配置,不需要自己定义,当然也可以自定义相关熟悉,详细属性请看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)
  1. 回调监听,获取选择器数据、状态
        //监听选择点击事件及返回结果
        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>
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方那座山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值