Giter Site home page Giter Site logo

zaaach / citypicker Goto Github PK

View Code? Open in Web Editor NEW
3.1K 52.0 586.0 13.79 MB

:fire::fire::fire:城市选择、定位、搜索及右侧字母导航,类似美团 百度糯米 饿了么等APP选择城市功能

Java 100.00%
city indexbar recyclerview location

citypicker's Introduction

CityPicker

Platform API

现在使用较多的类似美团、外卖等APP的城市选择界面,一行代码搞定,就是这么简单粗暴!!!

Tips:(旧版本1.x)会报高德定位jar包冲突,推荐使用2.x版本。

主要功能:

  • 字母悬浮栏
  • 指定热门城市
  • 自定义动画效果
  • 自定义主题
  • 名称或拼音搜索
  • 返回城市名、code等数据
  • 提供定位接口,解耦定位SDK

Preview

image image image

APK

下载demo.apk体验.

Download

1: 项目根目录的build.gradle添加如下配置:

allprojects {
	repositories {
		...
		maven { url 'https://jitpack.io' }
	}
}

2: app添加依赖:

dependencies {
	 implementation 'com.github.zaaach:CityPicker:x.y.z'
}

记得把x.y.z替换为jitpack中的数字

Usage

CityPicker 基于DialogFragment 实现,已提供定位接口,需要APP自身实现定位。

基本使用:

Step1:

manifest.xml中给使用CityPickeractivity添加主题android:theme="@style/DefaultCityPickerTheme"

<activity android:name=".MainActivity" android:theme="@style/DefaultCityPickerTheme">
  ......
</activity>

Step2:

注意:热门城市使用HotCity ,定位城市使用LocatedCity

List<HotCity> hotCities = new ArrayList<>();
hotCities.add(new HotCity("北京", "北京", "101010100")); //code为城市代码
hotCities.add(new HotCity("上海", "上海", "101020100"));
hotCities.add(new HotCity("广州", "广东", "101280101"));
hotCities.add(new HotCity("深圳", "广东", "101280601"));
hotCities.add(new HotCity("杭州", "浙江", "101210101"));
......

CityPicker.from(activity) //activity或者fragment
  .enableAnimation(true)	//启用动画效果,默认无
  .setAnimationStyle(anim)	//自定义动画
  .setLocatedCity(new LocatedCity("杭州", "浙江", "101210101")))  //APP自身已定位的城市,传null会自动定位(默认)
  .setHotCities(hotCities)	//指定热门城市
  .setOnPickListener(new OnPickListener() {
    @Override
    public void onPick(int position, City data) {
      Toast.makeText(getApplicationContext(), data.getName(), Toast.LENGTH_SHORT).show();
    }
      
    @Override
    public void onCancel(){
      Toast.makeText(getApplicationContext(), "取消选择", Toast.LENGTH_SHORT).show();     
    }
      
    @Override
    public void onLocate() {
      //定位接口,需要APP自身实现,这里模拟一下定位
      new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
          //定位完成之后更新数据
          CityPicker.getInstance()
            .locateComplete(new LocatedCity("深圳", "广东", "101280601"), LocateState.SUCCESS);
        }
      }, 3000);
    }
  })
  .show();

关于自定义主题:

style.xml 中自定义主题并且继承DefaultCityPickerTheme ,别忘了在manifest.xml 设置给activity

<style name="CustomTheme" parent="DefaultCityPickerTheme">
        <item name="cpCancelTextColor">@color/color_green</item>
        <item name="cpSearchCursorDrawable">@color/color_green</item>
        <item name="cpIndexBarNormalTextColor">@color/color_green</item>
        <item name="cpIndexBarSelectedTextColor">@color/color_green</item>
        <item name="cpSectionHeight">@dimen/custom_section_height</item>
        <item name="cpOverlayBackground">@color/color_green</item>
  		......
</style>

CityPicker 中自定义的所有属性如下,有些属性值必须是引用类型refrence,使用时注意。

<resources>
    <attr name="cpCancelTextSize" format="dimension|reference" />
    <attr name="cpCancelTextColor" format="color|reference" />

    <attr name="cpClearTextIcon" format="reference" />
    <attr name="cpSearchTextSize" format="dimension|reference" />
    <attr name="cpSearchTextColor" format="color|reference" />
    <attr name="cpSearchHintText" format="string|reference" />
    <attr name="cpSearchHintTextColor" format="color|reference" />
    <attr name="cpSearchCursorDrawable" format="reference" />

    <attr name="cpListItemTextSize" format="dimension|reference" />
    <attr name="cpListItemTextColor" format="color|reference" />
    <attr name="cpListItemHeight" format="dimension|reference"/>

    <attr name="cpEmptyIcon" format="reference"/>
    <attr name="cpEmptyIconWidth" format="dimension|reference"/>
    <attr name="cpEmptyIconHeight" format="dimension|reference"/>
    <attr name="cpEmptyText" format="string|reference"/>
    <attr name="cpEmptyTextSize" format="dimension|reference"/>
    <attr name="cpEmptyTextColor" format="color|reference"/>

    <attr name="cpGridItemBackground" format="color|reference"/>
    <attr name="cpGridItemSpace" format="reference"/>
	<!--悬浮栏-->
    <attr name="cpSectionHeight" format="reference"/>
    <attr name="cpSectionTextSize" format="reference" />
    <attr name="cpSectionTextColor" format="reference" />
    <attr name="cpSectionBackground" format="reference" />

    <attr name="cpIndexBarTextSize" format="reference" />
    <attr name="cpIndexBarNormalTextColor" format="reference" />
    <attr name="cpIndexBarSelectedTextColor" format="reference" />
	<!--特写布局-->
    <attr name="cpOverlayWidth" format="dimension|reference"/>
    <attr name="cpOverlayHeight" format="dimension|reference"/>
    <attr name="cpOverlayTextSize" format="dimension|reference"/>
    <attr name="cpOverlayTextColor" format="color|reference"/>
    <attr name="cpOverlayBackground" format="color|reference"/>
</resources>

OK,enjoy it~

Changelog

v2.1.0

  • 迁移至AndroidX

v2.0.3

  • 修复状态栏变黑问题
  • 修复字母索引栏被软遮挡的问题
  • 新增取消选择监听
  • 方法调用方式稍微改变

v2.0.2

  • 修复定位城市偶尔不刷新的bug

v2.0.1

  • 新增定位接口
  • 修改返回类型为City ,可获取城市名、code等数据

v2.0.0

  • 项目重构优化,结构更清晰
  • 使用RecyclerView

感谢

ImmersionBar

About me

掘金: https://juejin.im/user/56f3dfe8efa6310055ac719f

简书: https://www.jianshu.com/u/913a8bb93d12

淘宝店: LEON家居生活馆 (动漫摆件)

LEON

😉淘宝店求个关注😉

QQ群

有兴趣可以加入QQ群一起交流: 扫码入群601783167

citypicker's People

Contributors

zaaach avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

citypicker's Issues

点击搜索框,一输入内容就崩掉,是你里面的代码报错,找不到rcy的那个方法

作者你好,在Fragment里面和Activity里面你都是这样。rcy根本没这个方法,怎么解决?

java.lang.NoSuchMethodError: No virtual method getItemDecorationAt(I)Landroid/support/v7/widget/RecyclerView$ItemDecoration; in class Landroid/support/v7/widget/RecyclerView; or its super classes (declaration of 'android.support.v7.widget.RecyclerView' appears in /data/app/com.bjbywx.wzt.wzt-2/split_lib_dependencies_apk.apk)
at com.zaaach.citypicker.CityPickerDialogFragment.afterTextChanged(CityPickerDialogFragment.java:207)
at android.widget.TextView.sendAfterTextChanged(TextView.java:8222)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:10424)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1218)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:579)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:509)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:508)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:844)
at android.view.inputmethod.BaseInputConnection.commitText(BaseInputConnection.java:198)
at com.android.internal.widget.EditableInputConnection.commitText(EditableInputConnection.java:183)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:353)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:93)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:177)
at android.app.ActivityThread.main(ActivityThread.java:6634)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:797)

存在内存泄漏,望大神修复下

D/LeakCanary: * com.zaaach.citypicker.CityPickerActivity has leaked:
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * GC ROOT com.loc.d$b.
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * references com.loc.d$b.a
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * references com.loc.d.d
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * references java.util.ArrayList.array
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * references array java.lang.Object[].[0]
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * references com.zaaach.citypicker.CityPickerActivity$1.this$0 (anonymous implementation of com.amap.api.location.AMapLocationListener)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * leaks com.zaaach.citypicker.CityPickerActivity instance
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Retaining: 124 KB.
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Reference Key: 3ff196aa-dbe0-451c-8291-2f0576e76d02
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Device: unknown WELINKIO LINK6 link6
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Android Version: 4.4.2 API: 19 LeakCanary: 1.5 00f37f5
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Durations: watch=35361ms, gc=147ms, heap dump=881ms, analysis=34278ms
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Details:
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Instance of com.loc.d$b
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | a = com.loc.d@1108127720 (0x420cafe8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | mLooper = android.os.Looper@1109355296 (0x421f6b20)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | mPriority = 0
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | mTid = 12590
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | contextClassLoader = dalvik.system.PathClassLoader@1107626464 (0x420509e0)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | vmThread = java.lang.VMThread@1109351712 (0x421f5d20)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | group = java.lang.ThreadGroup@1101673824 (0x41aa3560)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | uncaughtHandler = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | target = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | inheritableValues = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | interruptActions = java.util.ArrayList@1109340104 (0x421f2fc8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | localValues = java.lang.ThreadLocal$Values@1108871288 (0x42180878)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | name = java.lang.String@1108842200 (0x421796d8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | parkBlocker = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | id = 398
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | stackSize = 0
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | priority = 5
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | parkState = 1
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | hasBeenStarted = true
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | daemon = false
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Instance of com.loc.d$b
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | a = com.loc.d@1108127720 (0x420cafe8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | mLooper = android.os.Looper@1109355296 (0x421f6b20)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | mPriority = 0
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | mTid = 12590
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | contextClassLoader = dalvik.system.PathClassLoader@1107626464 (0x420509e0)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | vmThread = java.lang.VMThread@1109351712 (0x421f5d20)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | group = java.lang.ThreadGroup@1101673824 (0x41aa3560)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | uncaughtHandler = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | target = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | inheritableValues = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | interruptActions = java.util.ArrayList@1109340104 (0x421f2fc8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | localValues = java.lang.ThreadLocal$Values@1108871288 (0x42180878)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | name = java.lang.String@1108842200 (0x421796d8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | parkBlocker = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | id = 398
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | stackSize = 0
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | priority = 5
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | parkState = 1
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | hasBeenStarted = true
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | daemon = false
03-27 16:02:24.960 12371-12719/? D/LeakCanary: * Instance of com.loc.d
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | w = com.loc.bz@1108802792 (0x4216fce8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | B = com.amap.api.location.AMapLocationClientOption$AMapLocationMode@1108841440 (0x421793e0)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | C = java.lang.Object@1109248400 (0x421dc990)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | D = com.loc.cu@1108802960 (0x4216fd90)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | E = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | v = com.loc.d$b@1108871152 (0x421807f0)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | G = java.lang.String@1108870776 (0x42180678)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | p = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | I = com.loc.d$a@1109245464 (0x421dbe18)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | J = com.amap.api.location.AMapLocation@1109327832 (0x421effd8)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | K = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | L = java.util.Hashtable@1108127952 (0x420cb0d0)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | l = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | k = android.os.Messenger@1109528848 (0x42221110)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | O = io.welink.weather.WeatherApp@1107677968 (0x4205d310)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | j = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | i = com.loc.h@1109245648 (0x421dbed0)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | R = org.json.JSONArray@1109500048 (0x4221a090)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | e = null
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | d = java.util.ArrayList@1109335928 (0x421f1f78)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | U = com.loc.d$1@1109281640 (0x421e4b68)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | V = java.util.LinkedList@1109336216 (0x421f2098)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | W = java.util.LinkedList@1109337944 (0x421f2758)
03-27 16:02:24.960 12371-12719/? D/LeakCanary: | c = com.loc.g@1108802648 (0x4216fc58)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | Y = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | a = com.amap.api.location.AMapLocationClientOption@1109101128 (0x421b8a48)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | b = com.loc.d$d@1108127992 (0x420cb0f8)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | X = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | z = 0.0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | r = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | q = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | o = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | h = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | Q = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | P = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | N = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | M = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | m = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | n = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | g = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | H = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | f = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | S = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | s = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | t = 240
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | u = 80
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | F = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | A = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | x = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | y = 0.0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | T = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: * Instance of java.util.ArrayList
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static $staticOverhead = byte[48]@1101628801 (0x41a98581)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static serialVersionUID = 8683452581122892189
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static MIN_CAPACITY_INCREMENT = 12
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | array = java.lang.Object[12]@1108811528 (0x42171f08)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | size = 1
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | modCount = 1
03-27 16:02:24.970 12371-12719/? D/LeakCanary: * Array of java.lang.Object[]
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [0] = com.zaaach.citypicker.CityPickerActivity$1@1108894120 (0x421861a8)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [1] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [2] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [3] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [4] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [5] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [6] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [7] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [8] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [9] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [10] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | [11] = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: * Instance of com.zaaach.citypicker.CityPickerActivity$1
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static $staticOverhead = byte[48]@1108080393 (0x420bf709)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static $change = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static serialVersionUID = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | this$0 = com.zaaach.citypicker.CityPickerActivity@1107590832 (0x42047eb0)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: * Instance of com.zaaach.citypicker.CityPickerActivity
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static $staticOverhead = byte[72]@1107773649 (0x420748d1)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static KEY_PICKED_CITY = java.lang.String@1108126984 (0x420cad08)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static $change = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | static serialVersionUID = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | clearBtn = android.widget.ImageView@1108906656 (0x421892a0)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | dbManager = com.zaaach.citypicker.db.DBManager@1107652576 (0x42056fe0)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | emptyView = android.widget.LinearLayout@1109373616 (0x421fb2b0)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mAllCities = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mCityAdapter = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mLetterBar = com.zaaach.citypicker.view.SideLetterBar@1108843824 (0x42179d30)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mListView = android.widget.ListView@1109282960 (0x421e5090)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mLocationClient = com.amap.api.location.AMapLocationClient@1109208864 (0x421d2f20)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mResultAdapter = com.zaaach.citypicker.adapter.ResultListAdapter@1109202240 (0x421d1540)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mResultListView = android.widget.ListView@1108795976 (0x4216e248)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | searchBox = android.widget.EditText@1109530744 (0x42221878)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mActionBar = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mActivityInfo = android.content.pm.ActivityInfo@1108885760 (0x42184100)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mAllLoaderManagers = android.util.ArrayMap@1109101304 (0x421b8af8)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mApplication = io.welink.weather.WeatherApp@1107677968 (0x4205d310)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mWindowManager = android.view.WindowManagerImpl@1108141816 (0x420ce6f8)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mWindow = com.android.internal.policy.impl.PhoneWindow@1107664408 (0x42059e18)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mUiThread = java.lang.Thread@1101679976 (0x41aa4d68)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mTranslucentCallback = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mComponent = android.content.ComponentName@1108234312 (0x420e5048)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mToken = android.os.BinderProxy@1108228984 (0x420e3b78)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mContainer = android.app.Activity$1@1107956832 (0x420a1460)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mCurrentConfig = android.content.res.Configuration@1108545704 (0x421310a8)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mDecor = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mTitle = java.lang.String@1108144560 (0x420cf1b0)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mDefaultKeySsb = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mSearchManager = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mResultData = android.content.Intent@1107867912 (0x4208b908)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mEmbeddedID = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mParent = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mMenuInflater = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mFragments = android.app.FragmentManagerImpl@1108801168 (0x4216f690)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mHandler = android.os.Handler@1108193056 (0x420daf20)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mHelper = android.app.swipeback.SwipeBackActivityHelper@1108132152 (0x420cc138)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mManagedDialogs = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mInstanceTracker = android.os.StrictMode$InstanceTracker@1107949368 (0x4209f738)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mInstrumentation = android.app.Instrumentation@1107626272 (0x42050920)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mIntent = android.content.Intent@1108946304 (0x42192d80)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mLastNonConfigurationInstances = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mLoaderManager = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mManagedCursors = java.util.ArrayList@1108200272 (0x420dcb50)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mMainThread = android.app.ActivityThread@1107608376 (0x4204c338)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mLoadersStarted = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mIdent = 1114526528
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mFinished = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mEnableDefaultActionBarUp = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mResultCode = -1
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mDoReportFullyDrawn = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mResumed = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mDestroyed = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mStartedActivity = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mStopped = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mTemporaryPause = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mDefaultKeyMode = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mTitleColor = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mTitleReady = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mConfigChangeFlags = 0
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mCheckedForLoaderManager = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mChangingConfigurations = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mVisibleFromClient = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mVisibleFromServer = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mChangeCanvasToTranslucent = false
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mWindowAdded = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mCalled = true
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mBase = android.app.ContextImpl@1109233888 (0x421d90e0)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mInflater = com.android.internal.policy.impl.PhoneLayoutInflater@1108817048 (0x42173498)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mOverrideConfiguration = null
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mResources = android.content.res.Resources@1107622992 (0x4204fc50)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mTheme = android.content.res.Resources$Theme@1108136680 (0x420cd2e8)
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mThemeResource = 2131296464
03-27 16:02:24.970 12371-12719/? D/LeakCanary: | mBase = android.app.ContextImpl@1109233888 (0x421d90e0)

高度测量问题, # 符号被遮挡

代码版本:2.0
高度测量问题, # 符号被遮挡 ,看下效果图:

我这页面顶部有个 EdiText,如果触发EdiText弹出软盘,然后收会软盘,#就可以显示出来,也就正常了
大佬这是什么问题?

更换低版本SDK后,dialogFragment显示报错

博主你好:
我更换了低版本sdk并且解决了getItemDecorationAt和其他强转等编译错误后,运行崩溃,通过debug发现是DialogFragment.show(ft,tag)引起的,错误信息为: Window feature must be requested before adding content,不知如何解决,还请指教

建议降低耦合度

建议将该控件封装为ViewGroup或Fragment,内部处理定位、搜索、拼音排序、数据库读取以及拼音条拖动定位等逻辑,外部暴漏方法供用户设置热门城市、监听item点击事件(热门/全部/搜索/定位)等

报错了.log信息如下

android.view.InflateException: Binary XML file line #7: Binary XML file line #12: Error inflating class EditText
Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class EditText
Caused by: java.lang.UnsupportedOperationException: Failed to resolve attribute at index 2: TypedValue{t=0x2/d=0x7f03009f a=-1}
at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:728)
at android.widget.TextView.(TextView.java:1226)
at android.widget.EditText.(EditText.java:88)
at android.widget.EditText.(EditText.java:84)
at android.support.v7.widget.AppCompatEditText.(AppCompatEditText.java:64)
at android.support.v7.widget.AppCompatEditText.(AppCompatEditText.java:60)
at android.support.v7.app.AppCompatViewInflater.createEditText(AppCompatViewInflater.java:191)
at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:113)
at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1035)
at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1092)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:776)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:734)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:867)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
at android.view.LayoutInflater.parseInclude(LayoutInflater.java:999)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:828)
at android.view.LayoutInflater.inflate(LayoutInflater.java:519)
at android.view.LayoutInflater.inflate(LayoutInflater.java:427)
at com.zaaach.citypicker.CityPickerDialogFragment.onCreateView(CityPickerDialogFragment.java:141)
at android.support.v4.app.Fragment.performCreateView(Fragment.java:2346)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1428)
at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1759)
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1827)
at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2596)
at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2383)
at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2338)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2245)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:703)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6600)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:518)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:821)

定位失败

定位失败:
1,尝试了在manifest里替换掉成自己的AppKey,无果,照样定位失败;
2,尝试了genymotion模拟器和真机运行,无果,照样定位失败;
3,尝试了把高德的错误信息log出来,显示错误码是2,错误信息是wifi信号不足。对照官网的错误表提供的解决方法是:重新尝试。无果,照样定位失败;
P.S:
(1)错误信息:location Error, ErrCode:2, errInfo:WIFI信息不足
(2)官网错误表地址:http://lbs.amap.com/api/android-location-sdk/guide/utilities/errorcode/#v2

最后想问作者,关于定位功能,还要哪儿是需要改动的吗?麻烦告知一下,先感谢了!
PS:看着很多个选择城市的demo,还是你这个做的最好集成。也做的很不错。感谢x3

定位失败

你好,按钮你上面的步骤试了后,4.4和7.1都不行,请问什么原因

界面显示问题

dialogFragment出来之后状态栏会变成黑色(本来是半透明的,三星s8,8.0系统)
而且edittext那里的paddingTop无效了,显示效果是状态栏和edittext紧挨着,中间没有padding(不知道怎么放图,不好意思)

请教一下,无法打开china_cities.db

您好,请问下我按照这个代码在eclipse上写了一遍之后无法打开china_cities.db,我看了下目录里面没有database这个目录,但是mkdirs这个方法执行了。Log:Failed to open database '/data/data/database/china_cities.db';android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14): Could not open database。

城市数据更改问题

@zaaach 你好,我发现你在项目里面用的城市编码是全国城市天气的代码,而我现在的需求是使用行政编码,所以想请教如何修改项目中的数据源,是需要把项目导出来,自己修改里面的db文件吗?

取消按钮点击闪退,自带返回键无问题

在Fragment中添加定位,按您的方法调用如下
image
其中,cityLocated,province,cityCode是调用initLocation( )后得到的定位数据。
问题:

  1. 第一次进入时,定位城市无显示;第二次及以后进入时正常。如下图所示为首次进入:
    image
  2. 点击取消按钮程序闪退,系统自带返回键不会出现这个问题,报错如下:
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.zaaach.citypicker.model.City.getName()' on a null object reference
    错误地方如下图标注(同图一)
    image

定位失败

你好!我按照你提供的方法设置,并且申请了高德的key,但还是显示定位失败,高德的key校验了sha1也没有问题。检查出来是定位权限问题,不知道你这个是否对6.0及以上版本还需做何处理?

Android6.0定位失败

是不是这个库里没有申请运行时权限?
还望大神能加入一下运行时权限的,晚辈感激不尽!

CityListAdapter有个bug,望大神修复下

/**
* 更新定位状态
* @param state
*/
public void updateLocateState(int state, String city){
this.locateState = state;
this.locatedCity = city;
//notifyDataSetChanged(); 导致地址选择拖拉无效,而且定位完成不会主动更新定位城市
}

android.view.InflateException: Binary XML file line #12: Error inflating class EditText

###显示Fragment的时候报这个错,Activity的Theme有设置。请问是什么原因啊?

Application crash
                                                                     android.view.InflateException: Binary XML file line #12: Error inflating class EditText
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:713)
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:755)
                                                                         at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839)
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:745)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
                                                                         at com.zaaach.citypicker.CityPickerDialogFragment.onCreateView(CityPickerDialogFragment.java:122)
                                                                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819)
                                                                         at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797)
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590)
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377)
                                                                         at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332)
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239)
                                                                         at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700)
                                                                         at android.os.Handler.handleCallback(Handler.java:733)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:136)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5333)
                                                                         at java.lang.reflect.Method.invokeNative(Native Method)
                                                                         at java.lang.reflect.Method.invoke(Method.java:515)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:711)
                                                                         at dalvik.system.NativeStart.main(Native Method)
                                                                      Caused by: java.lang.UnsupportedOperationException: Can't convert to dimension: type=0x2
                                                                         at android.content.res.TypedArray.getDimensionPixelSize(TypedArray.java:478)
                                                                         at android.widget.TextView.<init>(TextView.java:991)
                                                                         at android.widget.EditText.<init>(EditText.java:60)
                                                                         at android.support.v7.widget.AppCompatEditText.<init>(AppCompatEditText.java:64)
                                                                         at android.support.v7.widget.AppCompatEditText.<init>(AppCompatEditText.java:60)
                                                                         at android.support.v7.app.AppCompatViewInflater.createView(AppCompatViewInflater.java:112)
                                                                         at android.support.v7.app.AppCompatDelegateImplV9.createView(AppCompatDelegateImplV9.java:1016)
                                                                         at android.support.v7.app.AppCompatDelegateImplV9.onCreateView(AppCompatDelegateImplV9.java:1073)
                                                                         at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:684)
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:755) 
                                                                         at android.view.LayoutInflater.parseInclude(LayoutInflater.java:839) 
                                                                         at android.view.LayoutInflater.rInflate(LayoutInflater.java:745) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:492) 
                                                                         at android.view.LayoutInflater.inflate(LayoutInflater.java:397) 
                                                                         at com.zaaach.citypicker.CityPickerDialogFragment.onCreateView(CityPickerDialogFragment.java:122) 
                                                                         at android.support.v4.app.Fragment.performCreateView(Fragment.java:2261) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1419) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1750) 
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1819) 
                                                                         at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:797) 
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2590) 
                                                                         at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2377) 
                                                                         at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2332) 
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2239) 
                                                                         at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:700) 
                                                                         at android.os.Handler.handleCallback(Handler.java:733) 
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95) 
                                                                         at android.os.Looper.loop(Looper.java:136) 
                                                                         at android.app.ActivityThread.main(ActivityThread.java:5333) 
                                                                         at java.lang.reflect.Method.invokeNative(Native Method) 
                                                                         at java.lang.reflect.Method.invoke(Method.java:515) 
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895) 
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:711) 
                                                                         at dalvik.system.NativeStart.main(Native Method) 

定位失败

定位失败,是需要配置自己的高德地图key吗?

Gradle导入不正确

用implementation 'com.zaaach:citypicker:2.0.1'这个导入提示错误,请问正确的导入是怎样的啊?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.