底部弹出PopupWindow+地址三级联动,多问题全面分析,详细注释

简介: 底部弹出PopupWindow+地址三级联动,多问题全面分析,详细注释

主要功能:从底部弹出的 PopupWindow,带动画,带灰色背景,在PopupWindow中实现省市区三级联动,并填充textview

image.png

先看效果图


1.PopupWindow


<span style="font-size:18px;">public class PopHelper {
    private Context mContext;
    private PopupWindow pw;
    private CityPicker cityPicker;
    public PopHelper(Context context) {
        mContext = context;
    }
    /**
     * @param view
     * @param itemsOnClick 抛出一个OnClickListener接口
     */
    public void showAddressPop(View view, final Activity activity, View.OnClickListener itemsOnClick) {
        // 设置pw里的点击事件
        LinearLayout addressView = (LinearLayout) View.inflate(mContext, R.layout.pop_address, null);
        Button btnPopAddressCencel = (Button) addressView.findViewById(R.id.btn_pop_address_cencel);
        btnPopAddressCencel.setOnClickListener(itemsOnClick);
        Button btnPopAddressEnter = (Button) addressView.findViewById(R.id.btn_pop_address_enter);
        btnPopAddressEnter.setOnClickListener(itemsOnClick);
        cityPicker = (CityPicker) addressView.findViewById(R.id.citypicker);
        //-2是包裹自己,-1是填充父容器
        pw = new PopupWindow(addressView, -1, -2);
        //先关闭
        colsePopupwindow();
        //必须要设置一个背景
        pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        //点击外边可关闭pw
        pw.setOutsideTouchable(true);
        //pw内可获取焦点
        pw.setFocusable(true);
        // 设置背景颜色变暗
        WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
        lp.alpha = 0.7f;
        activity.getWindow().setAttributes(lp);
        //退出时恢复透明度
        pw.setOnDismissListener(new PopupWindow.OnDismissListener() {
            @Override
            public void onDismiss() {
                WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
                lp.alpha = 1f;
                activity.getWindow().setAttributes(lp);
            }
        });
        //设置动画
        pw.setAnimationStyle(R.style.take_photo_anim);
        //显示。y轴距离底部100是因为部分手机有虚拟按键,所以实际项目中要动态设置
        pw.showAtLocation(view, Gravity.BOTTOM, 0, 100);
    }
    /**
     *
     * @return 获取控件中的地址数据
     */
    public String getAddressData() {
        String cData = cityPicker.getCity_string();
        return cData;
    }
    /**
     * 关闭pw
     */
    public void colsePopupwindow() {
        if (pw != null && pw.isShowing()) {
            pw.dismiss();
            pw = null;
        }
    }
}</span>

2.pop的弹出退出动画

pop_enter_anim.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
  <translate 
    android:duration="200" 
    android:fromYDelta="100%p" 
    android:toYDelta="0" /> 
  <alpha 
    android:duration="200" 
    android:fromAlpha="0.0" 
    android:toAlpha="1.0" /> 
</set></span>
pop_exit_anim.xml
<span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android"> 
  <translate 
    android:duration="200" 
    android:fromYDelta="0" 
    android:toYDelta="50%p" /> 
  <alpha 
    android:duration="200" 
    android:fromAlpha="1.0" 
    android:toAlpha="0.0" /> 
</set> </span>

记得copy  styles文件中的style


3.在MainActivity中的调用

<span style="font-size:18px;">public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    private TextView textView1, textView2;
    private Button button1, button2;
    private PopHelper popHelper;//pop
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView1 = (TextView) findViewById(R.id.textView1);
        textView2 = (TextView) findViewById(R.id.textView2);
        button1 = (Button) findViewById(R.id.button1);
        button1.setOnClickListener(this);
        button2 = (Button) findViewById(R.id.button2);
        button2.setOnClickListener(this);
    }
    /**
     * 实现popHelper中的item接口
     */
    private View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_pop_address_cencel:
                    popHelper.colsePopupwindow();
                    break;
                case R.id.btn_pop_address_enter:
                    String addressData = popHelper.getAddressData();
                    if (flag) {
                        textView1.setText(addressData);
                    } else {
                        textView2.setText(addressData);
                    }
                    popHelper.colsePopupwindow();
                    break;
            }
        }
    };
    boolean flag;//用于pop标记显示,避免多个地方显示却只填充一个textview的情况
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                popHelper = new PopHelper(getApplicationContext());
                popHelper.showAddressPop(v, MainActivity.this, onClickListener);
                flag = true;
                break;
            case R.id.button2:
                popHelper = new PopHelper(getApplicationContext());
                popHelper.showAddressPop(v, MainActivity.this, onClickListener);
                flag = false;
                break;
        }
    }
}</span>

4.地址三级联动

首先,在main目录下创建assets文件,并copy城市json数据包


其次,在lib中加入gson包,记得As a lib,或直接


<span style="font-size:18px;">compile 'com.google.code.gson:gson:2.6.2'</span>

然后,修改布局中的控件名称换成自己的包名+自定义类名

最后在values文件夹中copy-attrs.xml文件

然后就完美实现了。


代码中都有详细注释


目录
相关文章
|
7月前
VSCode如何自动换行,右侧换行间距长度,隐藏右侧代码预览(Minimap代码缩略图滚动条),比对代码差异窗口也自动换行
VSCode如何自动换行,右侧换行间距长度,隐藏右侧代码预览(Minimap代码缩略图滚动条),比对代码差异窗口也自动换行
|
XML Android开发 数据格式
简单使用BottomSheetBehavior实现底部弹窗
这次带来的是BottomSheetBehavior的简单使用,BottomSheetBehavior是Android Support Library23.2中引入的,它可以轻松实现底部动作条功能。
4552 0
|
5月前
|
前端开发 JavaScript
Elementplus如何使面包屑往左边移动,右边头像下拉菜单如何写,下拉菜单如何靠中一点,下拉菜单出现文字不对齐怎么办,如何设置鼠标样式,如何使用阿里妈妈icon,如何点击icon全屏
Elementplus如何使面包屑往左边移动,右边头像下拉菜单如何写,下拉菜单如何靠中一点,下拉菜单出现文字不对齐怎么办,如何设置鼠标样式,如何使用阿里妈妈icon,如何点击icon全屏
Elementplus如何使面包屑往左边移动,右边头像下拉菜单如何写,下拉菜单如何靠中一点,下拉菜单出现文字不对齐怎么办,如何设置鼠标样式,如何使用阿里妈妈icon,如何点击icon全屏
uniapp滚动条置顶效果、自定义页面滚动条的位置(整理)
uniapp滚动条置顶效果、自定义页面滚动条的位置(整理)
|
7月前
|
iOS开发
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱
104 1
点击添加按钮弹框动态添加内容并且拼接在页面
点击添加按钮弹框动态添加内容并且拼接在页面
38 0
随便给你一个页面 你该如何去给他布局呢 各位思考一下 ?
随便给你一个页面 你该如何去给他布局呢 各位思考一下 ?
64 0
|
JSON 小程序 JavaScript
小程序地图插入图标后 怎么实现点击图标弹出窗口
小程序地图插入图标后 怎么实现点击图标弹出窗口
109 0
|
存储 前端开发 程序员
iOS开发:实现点击常用控件弹出地区选择框(万能方法)
在iOS开发中会遇到一些选择选项的需求,而且点击一个控件弹出一个选择框,选择之后展示到前端,然后再把选择的内容传给后台或者做本地存储。这个需求对于大多数开发者来说可以为小儿科,但是作为一个爱记录的程序猿来说相当可贵,所以还是那句话,只分享给有缘人,大牛可以飘过,不喜勿喷请走开。
444 0
iOS开发:实现点击常用控件弹出地区选择框(万能方法)

热门文章

最新文章