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

举报
yechaoa 发表于 2022/05/30 22:29:13 2022/05/30
【摘要】 主要功能:从底部弹出的 PopupWindow,带动画,带灰色背景,在PopupWindow中实现省市区三级联动,并填充textview 先看效果图 1.PopupWindow <span style="font-size:18px;">public class PopHelper { p...

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

先看效果图


1.PopupWindow


  
  1. <span style="font-size:18px;">public class PopHelper {
  2. private Context mContext;
  3. private PopupWindow pw;
  4. private CityPicker cityPicker;
  5. public PopHelper(Context context) {
  6. mContext = context;
  7. }
  8. /**
  9. * @param view
  10. * @param itemsOnClick 抛出一个OnClickListener接口
  11. */
  12. public void showAddressPop(View view, final Activity activity, View.OnClickListener itemsOnClick) {
  13. // 设置pw里的点击事件
  14. LinearLayout addressView = (LinearLayout) View.inflate(mContext, R.layout.pop_address, null);
  15. Button btnPopAddressCencel = (Button) addressView.findViewById(R.id.btn_pop_address_cencel);
  16. btnPopAddressCencel.setOnClickListener(itemsOnClick);
  17. Button btnPopAddressEnter = (Button) addressView.findViewById(R.id.btn_pop_address_enter);
  18. btnPopAddressEnter.setOnClickListener(itemsOnClick);
  19. cityPicker = (CityPicker) addressView.findViewById(R.id.citypicker);
  20. //-2是包裹自己,-1是填充父容器
  21. pw = new PopupWindow(addressView, -1, -2);
  22. //先关闭
  23. colsePopupwindow();
  24. //必须要设置一个背景
  25. pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
  26. //点击外边可关闭pw
  27. pw.setOutsideTouchable(true);
  28. //pw内可获取焦点
  29. pw.setFocusable(true);
  30. // 设置背景颜色变暗
  31. WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
  32. lp.alpha = 0.7f;
  33. activity.getWindow().setAttributes(lp);
  34. //退出时恢复透明度
  35. pw.setOnDismissListener(new PopupWindow.OnDismissListener() {
  36. @Override
  37. public void onDismiss() {
  38. WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
  39. lp.alpha = 1f;
  40. activity.getWindow().setAttributes(lp);
  41. }
  42. });
  43. //设置动画
  44. pw.setAnimationStyle(R.style.take_photo_anim);
  45. //显示。y轴距离底部100是因为部分手机有虚拟按键,所以实际项目中要动态设置
  46. pw.showAtLocation(view, Gravity.BOTTOM, 0, 100);
  47. }
  48. /**
  49. *
  50. * @return 获取控件中的地址数据
  51. */
  52. public String getAddressData() {
  53. String cData = cityPicker.getCity_string();
  54. return cData;
  55. }
  56. /**
  57. * 关闭pw
  58. */
  59. public void colsePopupwindow() {
  60. if (pw != null && pw.isShowing()) {
  61. pw.dismiss();
  62. pw = null;
  63. }
  64. }
  65. }</span>
2.pop的弹出退出动画

pop_enter_anim.xml


  
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration="200"
  5. android:fromYDelta="100%p"
  6. android:toYDelta="0" />
  7. <alpha
  8. android:duration="200"
  9. android:fromAlpha="0.0"
  10. android:toAlpha="1.0" />
  11. </set></span>
pop_exit_anim.xml

  
  1. <span style="font-size:18px;"><?xml version="1.0" encoding="utf-8"?>
  2. <set xmlns:android="http://schemas.android.com/apk/res/android">
  3. <translate
  4. android:duration="200"
  5. android:fromYDelta="0"
  6. android:toYDelta="50%p" />
  7. <alpha
  8. android:duration="200"
  9. android:fromAlpha="1.0"
  10. android:toAlpha="0.0" />
  11. </set> </span>

记得copy  styles文件中的style

3.在MainActivity中的调用


  
  1. <span style="font-size:18px;">public class MainActivity extends AppCompatActivity implements View.OnClickListener {
  2. private TextView textView1, textView2;
  3. private Button button1, button2;
  4. private PopHelper popHelper;//pop
  5. @Override
  6. protected void onCreate(Bundle savedInstanceState) {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. textView1 = (TextView) findViewById(R.id.textView1);
  10. textView2 = (TextView) findViewById(R.id.textView2);
  11. button1 = (Button) findViewById(R.id.button1);
  12. button1.setOnClickListener(this);
  13. button2 = (Button) findViewById(R.id.button2);
  14. button2.setOnClickListener(this);
  15. }
  16. /**
  17. * 实现popHelper中的item接口
  18. */
  19. private View.OnClickListener onClickListener = new View.OnClickListener() {
  20. @Override
  21. public void onClick(View v) {
  22. switch (v.getId()) {
  23. case R.id.btn_pop_address_cencel:
  24. popHelper.colsePopupwindow();
  25. break;
  26. case R.id.btn_pop_address_enter:
  27. String addressData = popHelper.getAddressData();
  28. if (flag) {
  29. textView1.setText(addressData);
  30. } else {
  31. textView2.setText(addressData);
  32. }
  33. popHelper.colsePopupwindow();
  34. break;
  35. }
  36. }
  37. };
  38. boolean flag;//用于pop标记显示,避免多个地方显示却只填充一个textview的情况
  39. @Override
  40. public void onClick(View v) {
  41. switch (v.getId()) {
  42. case R.id.button1:
  43. popHelper = new PopHelper(getApplicationContext());
  44. popHelper.showAddressPop(v, MainActivity.this, onClickListener);
  45. flag = true;
  46. break;
  47. case R.id.button2:
  48. popHelper = new PopHelper(getApplicationContext());
  49. popHelper.showAddressPop(v, MainActivity.this, onClickListener);
  50. flag = false;
  51. break;
  52. }
  53. }
  54. }</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文件
然后就完美实现了。

代码中都有详细注释

源码下载地址:https://github.com/yechaoa/PopAddress

文章来源: blog.csdn.net,作者:yechaoa,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/yechaoa/article/details/52818287

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。