美文网首页AppAndroidAndroid 文章
Android CityPicker2.0:类似美团等APP选择

Android CityPicker2.0:类似美团等APP选择

作者: 这条鱼有点甜 | 来源:发表于2018-03-02 20:53 被阅读710次

    CityPicker

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

    主要功能:

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

    Preview

    定位接口 默认主题 搜索功能 自定义主题

    APK

    下载demo.apk体验.

    Install

    Gradle:

    implementation 'com.zaaach:citypicker:2.0.1'
    

    or Maven:

    <dependency>
      <groupId>com.zaaach</groupId>
      <artifactId>citypicker</artifactId>
      <version>2.0.1</version>
      <type>pom</type>
    </dependency>
    

    or 下载library手动导入.

    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"));
    hotCities.add(new HotCity("上海", "上海", "101020100"));
    hotCities.add(new HotCity("广州", "广东", "101280101"));
    hotCities.add(new HotCity("深圳", "广东", "101280601"));
    hotCities.add(new HotCity("杭州", "浙江", "101210101"));
    ......
    
    CityPicker.getInstance()
      .setFragmentManager(getSupportFragmentManager())  //此方法必须调用
      .enableAnimation(enable)  //启用动画效果
      .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 onLocate() {
          //开始定位,这里模拟一下定位
          new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
              //定位完成之后更新数据
              CityPicker.getInstance()
                .locateComplete(new LocatedCity("深圳", "广东", "101280601"), LocateState.SUCCESS);
            }
          }, 2000);
        }
      })
      .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.0.1

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

    v2.0.0

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

    Github地址:

    https://github.com/zaaach/CityPicker欢迎star或提供建议~

    相关文章

      网友评论

      • 18c9f264717e:楼主,有个问题,该功能只能在继承Fragment下才能使用吗? 我在继承AppCompatActivity下获取 getSupportFragmentManager(); 该 .setFragmentManager(getSupportFragmentManager())报异常.麻烦解释一下
      • 青穗CherishTang:牵下来看了下,除了界面还可以其他的。。。。首先1、点击取消按钮第二次打开崩溃,其次2、列表排序都不做吗?这两个是很低级的错误吧。。。希望以后代码注意下了
      • 有点健忘:麻烦作者能处理下输入法,手指触摸的时候隐藏掉,这个感觉体验不太好,
        另外定位城市,如果没有传,可以fragment弹出来的时候可以调用onLocate自动开始定位吗?
        谢谢分享,万一以后需要了,也就懒得写了,直接就用拉:smile:
        有点健忘:@Bro0cL 是的,希望滚动的时候自动隐藏输入法
        这条鱼有点甜:@有点健忘 是滚动列表时隐藏输入法对吗?你说的定位之后也可以加上去

      本文标题:Android CityPicker2.0:类似美团等APP选择

      本文链接:https://www.haomeiwen.com/subject/zulzxftx.html