在使用PopupWindow的时候,有一个不好的地方就是不太好设置弹出窗体的大小。如果指定绝对大小,那么对于不同分辨率不同尺寸的手机来说,显示出来效果会不同,从而导致用户体验不佳。

为了达到PopupWindow能够自适配布局大小,可以在设置长宽时候指定:

[java] view
plain
copy

  1. popupWindow.setWidth(LayoutParams.WRAP_CONTENT);
  2. popupWindow.setHeight(LayoutParams.WRAP_CONTENT);

下面我就来具体讲解一下在PopupWindow中使用ListView的方法。

首先贴出的是main.xml

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="fill_parent"
  4. android:layout_height="fill_parent">
  5. <Button android:id="@+id/button"
  6. android:layout_width="match_parent"
  7. android:layout_height="wrap_content"
  8. android:text="弹出popupWindow" />
  9. </LinearLayout>

然后贴出的是PopupWindow中显示的listview_demo.xml

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ListView android:id="@+id/listview"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent" />
  8. </LinearLayout>

再贴出的是listview显示的每一项item.xml

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <TextView android:id="@+id/item"
  6. android:layout_width="wrap_content"
  7. android:layout_height="wrap_content"
  8. android:textSize="18sp" />
  9. </LinearLayout>

最后贴出的是java代码PopupWindowDemoActivity.java

[java] view
plain
copy

  1. package xmu.zgy;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import android.app.Activity;
  7. import android.os.Bundle;
  8. import android.view.LayoutInflater;
  9. import android.view.View;
  10. import android.view.View.OnClickListener;
  11. import android.view.ViewGroup.LayoutParams;
  12. import android.widget.Button;
  13. import android.widget.ListView;
  14. import android.widget.PopupWindow;
  15. import android.widget.SimpleAdapter;
  16. /**
  17. *
  18. * @author yulongfei
  19. * @blog blog.csdn.net/zgyulongfei
  20. *
  21. */
  22. public class PopupWindowDemoActivity extends Activity {
  23. private Button button;
  24. private PopupWindow popupWindow;
  25. private ListView listView;
  26. @Override
  27. public void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. setContentView(R.layout.main);
  30. initControls();
  31. }
  32. private void initControls() {
  33. LayoutInflater inflater = LayoutInflater.from(this);
  34. View view = inflater.inflate(R.layout.listview_demo, null);
  35. SimpleAdapter adapter = new SimpleAdapter(this, getData(),
  36. R.layout.item,
  37. new String[] { "text" },
  38. new int[] { R.id.item });
  39. listView = (ListView) view.findViewById(R.id.listview);
  40. listView.setAdapter(adapter);
  41. //自适配长、框设置
  42. popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT,
  43. LayoutParams.WRAP_CONTENT);
  44. popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg));
  45. popupWindow.setOutsideTouchable(true);
  46. popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
  47. popupWindow.update();
  48. popupWindow.setTouchable(true);
  49. popupWindow.setFocusable(true);
  50. button = (Button) findViewById(R.id.button);
  51. button.setOnClickListener(new OnClickListener() {
  52. @Override
  53. public void onClick(View v) {
  54. if (!popupWindow.isShowing()) {
  55. popupWindow.showAsDropDown(button, 0, 0);
  56. }
  57. }
  58. });
  59. }
  60. private List<Map<String, String>> getData() {
  61. List<Map<String, String>> list = new ArrayList<Map<String, String>>();
  62. Map<String, String> map = new HashMap<String, String>();
  63. map.put("text", "中国");
  64. list.add(map);
  65. map = new HashMap<String, String>();
  66. map.put("text", "加油");
  67. list.add(map);
  68. map = new HashMap<String, String>();
  69. map.put("text", "钓鱼岛是中国的");
  70. list.add(map);
  71. map = new HashMap<String, String>();
  72. map.put("text", "!!");
  73. list.add(map);
  74. return list;
  75. }
  76. }

运行结果图如下所示:

咦?不是已经设置自适应长和宽了吗?为什么显示出来的效果还是占满屏幕的宽度呢?

可以看看stackoverflow上面这个人问的问题,这个问题想必纠结了挺多人。虽然我不知道具体的原因是什么,但是我有个解决的方案,我也同时在stackoverflow上做了解答,下面我具体来说明一下。

为了让PopupWindow能够自适应ListView的内容,需要在listview_demo.xml添加一项:

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical" android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ListView android:id="@+id/listview"
  6. android:layout_width="match_parent"
  7. android:layout_height="match_parent" />
  8. <TextView android:layout_width="wrap_content"
  9. android:layout_height="0dp"
  10. android:textSize="18sp"
  11. android:text="钓鱼岛是中国的" />
  12. </LinearLayout>

先看显示结果再做解释:

看到了吗?很神奇吧,popupwindow的宽度进行了自适配。

因为我在xml中加了一个TextView,然后设置了高度为0,这样他就看不到了。

最重要的步骤是我在TextView中设置了android:text="钓鱼岛是中国的",这一句是关键性的动作。

因为TextView才是自适配的砝码,要在text中写上你的listView中最长的那个字符。上述demo中,所有显示的文字{中国,加油,钓鱼岛是中国的,!!!}中”钓鱼岛是中国的“是最长的。

虽然方法不太好,但是实现了效果。如果你遇到这样的问题,可以试试这种方式。

希望本文能够帮到有需要的朋友!

点击下载本文Demo。

popupwindow和listview的更多相关文章

  1. PopupWindow+ListView+OnItemClick点击无效

    昨天踩了个大坑,从下午折腾到现在.实现以下功能: popupWindow显示listview,listView OnItemClick点击后获取值. 由于重写listview 是有两部分 列表正文和右 ...

  2. android 三种弹出框之一PopupWindow

    PopupWindow 在android的弹出框我目前了解到的是有三种:AlertDialog,PopupWindow,Activity伪弹框, AlertDialog太熟悉了,这里就不介绍了 就先看 ...

  3. PopupWindow的使用以及ArrayAdatper.notifyDataSetChanged()无效详解

    Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意 AlertDialog是非阻 ...

  4. PopupWindow下拉列表

    效果图 步骤: 1.画出编辑框的布局.popupWindow的布局.popupWindow中listview每行的布局 2.new一个PopupWindow对象,设置其属性 3.定义一个BaseAda ...

  5. 弹出PopupWindow背景变暗的实现

    弹出PopuoWindow后 代码里设置的是PopupWindow默认获取焦点 所以PopupWindow显示的时候其它控件点击是没有反应的 用到的方法是 pwMyPopWindow.setFocus ...

  6. Android下拉选择框之PopupWindow

    1.效果图 2.思路分析 1.点击弹出对话框 popupwindow 2.对popupwindow进行相关设置,popupwindow中设置view为listview 3.listview中item设 ...

  7. Android笔记——Android自定义控件

    目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果 ...

  8. Android之仿微信图片选择器

    先上效果图.第一张图显示的是“相机”文件夹中的所有图片:通过点击多张图片可以到第二张图所示的效果(被选择的图片会变暗,同时选择按钮变亮):点击最下面的那一栏可以到第三张图所示的效果(显示手机中所有包含 ...

  9. Android自定义spinner下拉框实现的实现

    一:前言 本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去 ...

随机推荐

  1. windows平台下cocos2d-x-3.0beta2创建新项目

    我目前使用的版本是cocos2d-x-3.0beta2 前提: 已安装了python2.7.3 已安装了VS2012 打开我的cocos2d-x-3.0beta2所在文件夹F:\Framework\c ...

  2. Spring中整合Cage,实现验证码功能

    1.pom.xml中添加Cage依赖. <dependency> <groupId>com.github.cage</groupId> <artifactId ...

  3. Spring利用反射调用接口

    首先在项目中使用java反射调用 //根据实例及参数名获得方法A Method method = event.getObj().getClass() .getMethod(event.getMetho ...

  4. 在confluence中出现Handshake failed due to invalid Upgrade header: null

    在confluence中出现Handshake failed due to invalid Upgrade header: null 昨天晚上同事说confluence写完日志保存不了,然后我登陆co ...

  5. vue拦截器实现统一token,并兼容IE9验证

    项目中使用vue搭建前端页面,并通过axios请求后台api接口,完成数据交互.如果验证口令token写在在每次的接口中,也是个不小的体力活,而且也不灵活.这里分享使用vue自带拦截器,给每次请求的头 ...

  6. hibernate4整合spring3出现java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;

    解决办法 原先:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annota ...

  7. Android颜色配置器

    一.Android Color设置 1.在xml文件中 想设置颜色直接设置background的属性或者其他的color属性.随便设置一个颜色如#000,再点击左边的颜色方块,弹出颜色选择器选择颜色 ...

  8. Python处理正则表达式超时的办法

    最近在项目中遇到一个问题,就是需要采用正则匹配一些疑似暗链和挂马的HTML代码,而公司的老大给的正则表达式有的地方写的不够严谨,导致在匹配的时候发生卡死的现象,而后面的逻辑自然无法执行了.虽然用正则表 ...

  9. MFC多线程

    当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...

  10. OWASP Top 10十大风险 – 10个最重大的Web应用风险与攻防

    先来看几个出现安全问题的例子 OWASP TOP10 开发为什么要知道OWASP TOP10 TOP1-注入 TOP1-注入的示例 TOP1-注入的防范 TOP1-使用ESAPI(https://gi ...