popupwindow和listview
在使用PopupWindow的时候,有一个不好的地方就是不太好设置弹出窗体的大小。如果指定绝对大小,那么对于不同分辨率不同尺寸的手机来说,显示出来效果会不同,从而导致用户体验不佳。
为了达到PopupWindow能够自适配布局大小,可以在设置长宽时候指定:
- popupWindow.setWidth(LayoutParams.WRAP_CONTENT);
- popupWindow.setHeight(LayoutParams.WRAP_CONTENT);
下面我就来具体讲解一下在PopupWindow中使用ListView的方法。
首先贴出的是main.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <Button android:id="@+id/button"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="弹出popupWindow" />
- </LinearLayout>
然后贴出的是PopupWindow中显示的listview_demo.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ListView android:id="@+id/listview"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- </LinearLayout>
再贴出的是listview显示的每一项item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextView android:id="@+id/item"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textSize="18sp" />
- </LinearLayout>
最后贴出的是java代码PopupWindowDemoActivity.java
- package xmu.zgy;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.ViewGroup.LayoutParams;
- import android.widget.Button;
- import android.widget.ListView;
- import android.widget.PopupWindow;
- import android.widget.SimpleAdapter;
- /**
- *
- * @author yulongfei
- * @blog blog.csdn.net/zgyulongfei
- *
- */
- public class PopupWindowDemoActivity extends Activity {
- private Button button;
- private PopupWindow popupWindow;
- private ListView listView;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- initControls();
- }
- private void initControls() {
- LayoutInflater inflater = LayoutInflater.from(this);
- View view = inflater.inflate(R.layout.listview_demo, null);
- SimpleAdapter adapter = new SimpleAdapter(this, getData(),
- R.layout.item,
- new String[] { "text" },
- new int[] { R.id.item });
- listView = (ListView) view.findViewById(R.id.listview);
- listView.setAdapter(adapter);
- //自适配长、框设置
- popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT);
- popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg));
- popupWindow.setOutsideTouchable(true);
- popupWindow.setAnimationStyle(android.R.style.Animation_Dialog);
- popupWindow.update();
- popupWindow.setTouchable(true);
- popupWindow.setFocusable(true);
- button = (Button) findViewById(R.id.button);
- button.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- if (!popupWindow.isShowing()) {
- popupWindow.showAsDropDown(button, 0, 0);
- }
- }
- });
- }
- private List<Map<String, String>> getData() {
- List<Map<String, String>> list = new ArrayList<Map<String, String>>();
- Map<String, String> map = new HashMap<String, String>();
- map.put("text", "中国");
- list.add(map);
- map = new HashMap<String, String>();
- map.put("text", "加油");
- list.add(map);
- map = new HashMap<String, String>();
- map.put("text", "钓鱼岛是中国的");
- list.add(map);
- map = new HashMap<String, String>();
- map.put("text", "!!");
- list.add(map);
- return list;
- }
- }
运行结果图如下所示:

咦?不是已经设置自适应长和宽了吗?为什么显示出来的效果还是占满屏幕的宽度呢?
可以看看stackoverflow上面这个人问的问题,这个问题想必纠结了挺多人。虽然我不知道具体的原因是什么,但是我有个解决的方案,我也同时在stackoverflow上做了解答,下面我具体来说明一下。
为了让PopupWindow能够自适应ListView的内容,需要在listview_demo.xml添加一项:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="match_parent"
- android:layout_height="match_parent">
- <ListView android:id="@+id/listview"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
- <TextView android:layout_width="wrap_content"
- android:layout_height="0dp"
- android:textSize="18sp"
- android:text="钓鱼岛是中国的" />
- </LinearLayout>
先看显示结果再做解释:

看到了吗?很神奇吧,popupwindow的宽度进行了自适配。
因为我在xml中加了一个TextView,然后设置了高度为0,这样他就看不到了。
最重要的步骤是我在TextView中设置了android:text="钓鱼岛是中国的",这一句是关键性的动作。
因为TextView才是自适配的砝码,要在text中写上你的listView中最长的那个字符。上述demo中,所有显示的文字{中国,加油,钓鱼岛是中国的,!!!}中”钓鱼岛是中国的“是最长的。
虽然方法不太好,但是实现了效果。如果你遇到这样的问题,可以试试这种方式。
希望本文能够帮到有需要的朋友!
popupwindow和listview的更多相关文章
- PopupWindow+ListView+OnItemClick点击无效
昨天踩了个大坑,从下午折腾到现在.实现以下功能: popupWindow显示listview,listView OnItemClick点击后获取值. 由于重写listview 是有两部分 列表正文和右 ...
- android 三种弹出框之一PopupWindow
PopupWindow 在android的弹出框我目前了解到的是有三种:AlertDialog,PopupWindow,Activity伪弹框, AlertDialog太熟悉了,这里就不介绍了 就先看 ...
- PopupWindow的使用以及ArrayAdatper.notifyDataSetChanged()无效详解
Android的对话框有两种:PopupWindow和AlertDialog.它们的不同点在于: AlertDialog的位置固定,而PopupWindow的位置可以随意 AlertDialog是非阻 ...
- PopupWindow下拉列表
效果图 步骤: 1.画出编辑框的布局.popupWindow的布局.popupWindow中listview每行的布局 2.new一个PopupWindow对象,设置其属性 3.定义一个BaseAda ...
- 弹出PopupWindow背景变暗的实现
弹出PopuoWindow后 代码里设置的是PopupWindow默认获取焦点 所以PopupWindow显示的时候其它控件点击是没有反应的 用到的方法是 pwMyPopWindow.setFocus ...
- Android下拉选择框之PopupWindow
1.效果图 2.思路分析 1.点击弹出对话框 popupwindow 2.对popupwindow进行相关设置,popupwindow中设置view为listview 3.listview中item设 ...
- Android笔记——Android自定义控件
目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果 ...
- Android之仿微信图片选择器
先上效果图.第一张图显示的是“相机”文件夹中的所有图片:通过点击多张图片可以到第二张图所示的效果(被选择的图片会变暗,同时选择按钮变亮):点击最下面的那一栏可以到第三张图所示的效果(显示手机中所有包含 ...
- Android自定义spinner下拉框实现的实现
一:前言 本人参考博客:http://blog.csdn.net/jdsjlzx/article/details/41316417 最近在弄一个下拉框,发现Android自带的很难实现我的功能,于是去 ...
随机推荐
- 图像融合之拉普拉斯融合(laplacian blending)
一.拉普拉斯融合基本步骤 1. 两幅图像L,R,以及二值掩模mask,给定金字塔层数level. 2. 分别根据L,R构建其对应的拉普拉斯残差金字塔(层数为level),并保留高斯金字塔下采样最顶端的 ...
- POJ-2299 Ultra-QuickSort---树状数组求逆序对+离散化
题目链接: https://vjudge.net/problem/POJ-2299 题目大意: 本题要求对于给定的无序数组,求出经过最少多少次相邻元素的交换之后,可以使数组从小到大有序. 两个数(a, ...
- CentOS7.2安装jdk7u80
1.cd /usr/local 2.tar zxvf jdk-7u80-linux-x64.tar.gz 3.vi /etc/profile 4.输入i 加入内容如下: export JAVA_HOM ...
- 数据结构之堆Heap
1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 2. 堆 ...
- tensorflow共享变量 the difference between tf.Variable() and get_variable()
一般这样用tf.get_variable(): v = tf.get_variable(name, shape, dtype, initializer) 下面内容来源于 http://blog.csd ...
- android基础-界面开发注意事项
做安卓开发时一定要注意,主线程不能更改UI界面,如果出现程序运行时崩溃的情况,如果没有明显的语法错误,请检查自己的进程是否出现冲突,崩溃.如果有与后台的连接,即请求向服务器发送请求的时尤其需要注意,或 ...
- linux系统性能监控--内存利用率
Linux提供了对物理内存进行合理.高效的访问并可以访问潜在的海量虚存的技术.虚存通常稍多于操作系统实际拥有的内存容量,以便将较少使用的数据卸载到磁盘存储器上,同时又呈现出系统拥有大量物理内存的假象. ...
- for循环创建文件夹
bash里面, for n in a b c; do mkdir $n/dir; done 这个会在a,b,c三个文件夹下创建一个名为dir的文件夹. 之前没有在语句后面加分号,导致在cmd界面提交不 ...
- SQL实例整理
本文适合将w3school的SQL教程(http://www.w3school.com.cn/sql/sql_create_table.asp)都基本看过一遍的猿友阅读. 说说博主的情况吧.毕业找工作 ...
- hive中的NULL(hive空值处理)
HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N, 这样造成浪费大量空间.而且用java.python直接进入 ...