目录

  • 1. CityPickerView开源框架简介
  • 2. CityPickerView在Android程序中的使用
  • 2.1 build.gradle(Module:app)添加依赖
  • 2.1.1 安装异常:Unable to resolve dependency for ':app@debugUnitTest/compileClasspath': Could not resolve liji.library.dev:citypickerview:5.2.2
  • 2.2 CityPickerView控件引用
  • 2.3 AVD软键盘隐藏
  • 2.3.1 设置启动某个Activity时隐藏软键盘
  • 2.3.2 单击EditText触发onclick事件而非focus事件并隐藏软键盘
  • 2.4 单击EditText触发CityPickerView完整实例
  • 2.4.1 activity_main.xml文件如下
  • 2.4.2 MainActivity.java文件如下
  • 2.4.3 demo演示
  • 3. 参考资料


1. CityPickerView开源框架简介

CityPickerView是一个城市选择器的开源框架,可以方便实现省市区三级联动选择。其贡献者在github提到:

“在实际的项目中一般情况下都需要使用到省市区三级联动地址选择的功能,有的公司是提供接口获取,有的公司则不是,需要自己实现。一开始,我也深受其扰,每次都是要复制一遍,就想能不能打个包出来,供大伙使用。所以自己就封装了一个,不需要自己添加数据源,直接引用即可。这就是CityPicker城市选择器的由来!”

话不多说,鼓掌~

该框架有以下几个功能点:

  • 支持仿iOS滚轮实现、仿京东样式、一级城市列表、三级城市列表
  • 支持多种自定义属性来满足开发者的需求
  • 简单的几行代码即可实现城市选择器功能
  • 支持使用自己的数据来实现城市选择器

那么,到底该如何使用呢?

附上CityPickerView开源地址

2. CityPickerView在Android程序中的使用

虽然网上有不少CityPickerView的实现,但都不太适合像我这样的小白,而且大多CityPickerView版本都还只停留在v1.1.0。本人兜兜转转走了不少弯路,最后领悟到还是看作者开源解说最实在(其实很多时候都是这样,看源码和官方文档事半功倍),因此特意在此记录。

本人环境:

Android Studio v4.0.1,
Gradle v6.1.1,
SDK 为Android 10.0+ (R).

2.1 build.gradle(Module:app)添加依赖

打开build.gradle(Module:app)文件,新加如下依赖,注意 不是 和它很像的build.gradle(Project:xxx)

dependencies {
    implementation 'liji.library.dev:citypickerview:5.2.2'
}

android 二级省市选择器 android城市选择器_Text

然后,根据AS提示Sync Now

android 二级省市选择器 android城市选择器_Text_02


剩下的,交给时间……

不知道其他朋友如何,我当时下载安装了差不多有25mins,最后还安装失败出现了下面的错误,真的十分无奈,不过好在问题最终迎刃而解。

2.1.1 安装异常:Unable to resolve dependency for ‘:app@debugUnitTest/compileClasspath’: Could not resolve liji.library.dev:citypickerview:5.2.2

出现异常:

Unable to resolve dependency for ‘:app@debugUnitTest/compileClasspath’: Could not resolve liji.library.dev:citypickerview:5.2.2

可能是代理proxy导致的,解决办法:

直接在ASGradle Scripts打开gradle.properties(Global Properties)文件;或者Settings-Build,Execution,Deployment-Gradle,找到Gradle user home里的路径打开gradle.properties文件。

然后注释掉“systemProp.http.proxy…”等语句,重新Sync Now,citypickerview-v5.2.2就会以非常快的速度导入完毕了。

android 二级省市选择器 android城市选择器_android 二级省市选择器_03


参考:

2.2 CityPickerView控件引用

作者提供了多种城市选择器样式及使用方法,这里以“样式一(仿iOS滚轮实现)”为例。

申明对象并预加载数据

public class AddNewAddressActivity extends Activity {

	//申明对象
	CityPickerView mPicker=new CityPickerView();
    @Override
    public void onCreate() {
        super.onCreate();
        //预先加载仿iOS滚轮实现的全部数据
        mPicker.init(this);
    }
}

点击button弹出选择器

//添加默认的配置,不需要自己定义,当然也可以自定义相关熟悉,详细属性请看demo
CityConfig cityConfig = new CityConfig.Builder().build();
mPicker.setConfig(cityConfig);

//监听选择点击事件及返回结果
mPicker.setOnCityItemClickListener(new OnCityItemClickListener() {
            @Override
            public void onSelected(ProvinceBean province, CityBean city, DistrictBean district) {
                 
                //省份province               
                //城市city
                //地区district 
            }
            
            @Override
            public void onCancel() {
                ToastUtils.showLongToast(this, "已取消");
            }
        });

	//显示
        mPicker.showCityPicker( );

详细属性

CityConfig cityConfig = new CityConfig.Builder()
                .title("选择城市")//标题
                .titleTextSize(18)//标题文字大小
                .titleTextColor("#585858")//标题文字颜  色
                .titleBackgroundColor("#E9E9E9")//标题栏背景色
                .confirTextColor("#585858")//确认按钮文字颜色
                .confirmText("ok")//确认按钮文字
                .confirmTextSize(16)//确认按钮文字大小
                .cancelTextColor("#585858")//取消按钮文字颜色
                .cancelText("cancel")//取消按钮文字
                .cancelTextSize(16)//取消按钮文字大小
                .setCityWheelType(CityConfig.WheelType.PRO_CITY_DIS)//显示类,只显示省份一级,显示省市两级还是显示省市区三级
                .showBackground(true)//是否显示半透明背景
                .visibleItemsCount(7)//显示item的数量
                .province("浙江省")//默认显示的省份
                .city("杭州市")//默认显示省份下面的城市
                .district("滨江区")//默认显示省市下面的区县数据
                .provinceCyclic(true)//省份滚轮是否可以循环滚动
                .cityCyclic(true)//城市滚轮是否可以循环滚动
                .districtCyclic(true)//区县滚轮是否循环滚动
                .setCustomItemLayout(R.layout.item_city)//自定义item的布局
                .setCustomItemTextViewId(R.id.item_city_name_tv)//自定义item布局里面的textViewid
                .drawShadows(false)//滚轮不显示模糊效果
                .setLineColor("#03a9f4")//中间横线的颜色
                .setLineHeigh(5)//中间横线的高度
                .setShowGAT(true)//是否显示港澳台数据,默认不显示
                .build();

//设置自定义的属性配置
CityPickerView.getInstance().setConfig(cityConfig);

“以上若使用了自定义的item布局,即自定义item里面的背景、文字大小颜色等属性,需要注意的是:布局只能包含一个TextView控件,同时控件id需要跟上面设置的一致,否则不显示结果。如果结果显示“hello”,说明TextView的id跟上面设置的不一致。”

//自定义的item_city.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_city_name_tv"
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:gravity="center"
        android:text="hello"
        android:textSize="18sp"
        android:textStyle="bold"/>
</LinearLayout>

点移步github:样式一(仿iOS滚轮实现)

2.3 AVD软键盘隐藏

这个是题外话,是本人做练习时非常想要解决的一点,读者可选择跳过;但它涉及到下部分完整实例的一些细节问题。

2.3.1 设置启动某个Activity时隐藏软键盘

Manifests 文件中对该Activity设置如下:

<activity android:name=".MainActivity"
            android:windowSoftInputMode="stateAlwaysHidden">
            <!--  设置启动某个Activity时,不弹出软键盘-->
            ...
</activity>

android 二级省市选择器 android城市选择器_android 二级省市选择器_04

2.3.2 单击EditText触发onclick事件而非focus事件并隐藏软键盘

EditText没获得焦点前,单击只能获得焦点,并不触发onclick事件。EditText获得焦点时,默认会弹出软键盘;点击EditText,默认不会弹出软键盘。倘若不想弹出软键盘,可添加Java代码:

final EditText editCity=findViewById(R.id.edit_city);

//点击监听
editCity.setOnClickListener(new View.OnClickListener() {
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    public void onClick(View v) {
        //点击编辑框隐藏软键盘
        editCity.setShowSoftInputOnFocus(false);
    }
}

换一种思路,倘若不需要EditText的焦点功能而只设置点击事件,可以不用添加Java源码,而通过xml里EditText属性控制,禁用获焦android:focusableInTouchMode=“false”。由此,触及EditText自然也不会弹出软键盘了。

<EditText
	android:id="@+id/edit_city"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"
	android:layout_marginTop="20dp"
	android:layout_marginBottom="40dp"
	android:clickable="true"
	android:focusableInTouchMode="false"/>

参考:

2.4 单击EditText触发CityPickerView完整实例

下面我们实现一个CityPickerView完整实例,需求是:

使用EditText控件输入城市:当用户点击EditText,出现iOS滚轮式省市区三级联动选择器,确定后EditText显示被选择的地址。

2.4.1 activity_main.xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    tools:ignore="ExtraText"
    android:layout_height="match_parent"
    android:layout_width="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_marginHorizontal="40dp"
        android:layout_marginTop="40dp">

        <TextView
            android:layout_marginTop="30dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="请输入地址:"
            android:textSize="20sp"/>
        <EditText
            android:id="@+id/edit_city"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="40dp"
            android:clickable="true"
            android:focusableInTouchMode="false"/>

    </LinearLayout>
</ScrollView>

2.4.2 MainActivity.java文件如下

package com.example.test4;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

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;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //城市选择器
        showCityPicker();
    }

    public void showCityPicker(){

        final CityPickerView cityPicker=new CityPickerView();
        cityPicker.init(this);
        CityConfig cityConfig = new CityConfig.Builder()
                .province("浙江省")//默认显示的省份
                .city("杭州市")//默认显示省份下面的城市
                .district("余杭区")//默认显示省市下面的区县数据
                .build();
        cityPicker.setConfig(cityConfig);

        final EditText editCity=findViewById(R.id.edit_city);

        //点击监听
        editCity.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                cityPicker.setOnCityItemClickListener(new OnCityItemClickListener() {
                    @SuppressLint("SetTextI18n")
                    @Override
                    //点击确定
                    public void onSelected(ProvinceBean province, CityBean city, DistrictBean district) {
                        Toast.makeText(MainActivity.this,province+" - "+city+" - "+district,Toast.LENGTH_LONG).show();
                        editCity.setText(province+" - "+city+" - "+district);
                    }
                    @Override
                    //点击取消
                    public void onCancel() {
                    }
                });
                cityPicker.showCityPicker();
            }
        });
    }
}

2.4.3 demo演示

android 二级省市选择器 android城市选择器_android 二级省市选择器_05

3. 参考资料