Android中PopupWindow的基本使用
来源:互联网 发布:淘宝数据魔方架构 编辑:程序博客网 时间:2024/06/07 06:56
PopupWindow在界面弹出一窗口,效果相信大家常常看到,不废话,下面代码,有简单的先来。
分三种使用方式:
1.直接相对某个控件弹出
实现代码:
布局:popu_bg.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="100dp" android:layout_height="wrap_content" android:background="@drawable/aa" > <LinearLayout android:id="@+id/show" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:orientation="vertical" > <TextView android:id="@+id/menu_start_chart" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="item1" android:textColor="@android:color/white" android:textSize="15sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#999999" /> <TextView android:id="@+id/menu_scan" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="item2" android:textColor="@android:color/white" android:textSize="15sp" /> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="#999999" /> <TextView android:id="@+id/menu_scan" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:text="item3" android:textColor="@android:color/white" android:textSize="15sp" /> </LinearLayout></LinearLayout>java代码
btn2=(Button)findViewById(R.id.btn2);btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {showPopuwindown(v);}});
protected void showPopuwindown(View v) {// TODO Auto-generated method stubif(popupWindow==null){infate=LayoutInflater.from(MainActivity.this);view=infate.inflate(R.layout.popu_bg,null);//创建PopupWindow构造函数,同时必须设置宽高参数,否则不显示popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);//初始化PopupWindow的ViewpopupWindow.setContentView(view);}//setFocusable设置PopupWindow的焦点//如果PopupWindow中有Editor的话,focusable要为truepopupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true);//想要让点击PopupWindow之外的地方PopupWindow消失你需要//调用setBackgroundDrawable(new BitmapDrawable());popupWindow.setBackgroundDrawable(new BitmapDrawable());//在btn2下面显示popupWindow.showAsDropDown(btn2);popupWindow.update();}
2.在弹出的PopupWindow里添加listview进行滑动效果
此效果点击按钮是弹出Popuwindow,内嵌一个listview,可以进行滑动,像微信右上角+一样,点击其中的item,Popuwindow消失,执行相应发操作,在这里一个toast提示。
布局代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="100dp" android:layout_height="140dp" android:background="@drawable/aa" > <ListView android:id="@+id/listview_bg" android:layout_width="match_parent" android:layout_height="wrap_content" android:divider="@android:color/white" android:dividerHeight="1dp" > </ListView></LinearLayout>item就不写了,会上传源码的。
protected void showPopuwindownListview(View v) {// TODO Auto-generated method stubif(popupWindow1==null){LayoutInflater infate1=(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);listView=infate1.inflate(R.layout.listview_popu_bg,null);lv=(ListView)listView.findViewById(R.id.listview_bg);adapter=new MyAdater(MainActivity.this, getData());lv.setAdapter(adapter);popupWindow1 = new PopupWindow(listView);popupWindow1.setWidth(LayoutParams.WRAP_CONTENT); popupWindow1.setHeight(LayoutParams.WRAP_CONTENT);popupWindow1.setContentView(listView);}popupWindow1.setFocusable(true);popupWindow1.setOutsideTouchable(true);popupWindow1.setBackgroundDrawable(new BitmapDrawable());popupWindow1.showAsDropDown(btn3);popupWindow1.update();lv.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {// TODO Auto-generated method stubToast.makeText(MainActivity.this, adapter.getItem(position), Toast.LENGTH_SHORT).show();popupWindow1.dismiss();}});} private List<String> getData(){ List<String> data = new ArrayList<String>(); data.add("测试数据1"); data.add("测试数据2"); data.add("测试数据3"); data.add("测试数据4"); data.add("测试数据5"); data.add("测试数据6"); return data; }
class MyAdater extends BaseAdapter{List<String> list=new ArrayList<String>();public Context context;private LayoutInflater infate;public MyAdater(Context context,List<String> list) {// TODO Auto-generated constructor stubthis.context=context;this.list=list;infate=LayoutInflater.from(context);}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn list.size();}@Overridepublic String getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubViewHold hold=null;if(convertView==null){hold=new ViewHold();convertView = infate.inflate(R.layout.item,null);hold.tv=(TextView)convertView.findViewById(R.id.tv_name);convertView.setTag(hold);}hold=(ViewHold) convertView.getTag();hold.tv.setText(list.get(position));return convertView;}class ViewHold{ImageView iv;TextView tv;}}
3.在listview的点击每个item,在相应的item处弹出PopupWindow
QQ消息有这效果,长按消息列表中的每条信息,就会在此条消息上方弹出-置顶|删除
布局就是和2一样,listview+item,然后就是PopupWindow的布局
list_tip_menu.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" > <LinearLayout android:id="@+id/w" android:layout_width="180dp" android:layout_height="60dp" android:gravity="center" android:orientation="vertical" android:background="#6d6d6d" > <TextView android:id="@+id/tip_show" android:layout_width="match_parent" android:layout_height="60dp" android:gravity="center" android:paddingLeft="5dp" android:paddingRight="5dp" android:text="测试数据w" android:textColor="@android:color/holo_orange_light" android:textSize="18sp" /> </LinearLayout></LinearLayout>
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_popuwindow);lv=(ListView)findViewById(R.id.listview);adapter=new MyAdater(this, getData());lv.setAdapter(adapter);lv.setOnItemLongClickListener(new OnItemLongClickListener() {@Overridepublic boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {// TODO Auto-generated method stubif(popupWindow==null){infate=PopuwindowActivity.this.getLayoutInflater();tipView =infate.inflate(R.layout.list_tip_menu, null);tv=(TextView)tipView.findViewById(R.id.tip_show);//PopupWindow(View contentView, int width, int height)//contentView为要显示的view,//width和height为宽和高,值为像素值,也可以是MATCHT_PARENT和WRAP_CONTENTpopupWindow=new PopupWindow(tipView, 200, 60);}tv.setText(adapter.getItem(position));popupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true);popupWindow.setBackgroundDrawable(new BitmapDrawable());//相对view下方的位置,可以设置负值向相反方向移动,默认左上角为(0,0)//popupWindow.showAsDropDown(view, view.getWidth()/2,0-(3*view.getHeight())/2 ); int[] location = new int[2]; view.getLocationOnScreen(location); //在点击的item上方中间 view为item,根据view,popuWindown计算的他们的宽长,从而确定位置 popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0]+view.getWidth()/2-popupWindow.getWidth()/2, location[1]-popupWindow.getHeight()); //左方// popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0]-popupWindow.getWidth(), location[1]); //右边 //popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0]+v.getWidth(), location[1]);popupWindow.update();return true;}});}private List<String> getData() {// TODO Auto-generated method stub List<String> datas = new ArrayList<String>();for (int i = 0; i < 100; i++) {datas.add("test数据"+i);}return datas;}涉及知识总结:
1> LayoutInflater 实例的三种方式
1.LayoutInflater inflater = getLayoutInflater(); //调用Activity的getLayoutInflater()
2.LayoutInflater localinflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
3. LayoutInflater inflater = LayoutInflater.from(context);
/** * Obtains the LayoutInflater from the given context. */ public static LayoutInflater from(Context context) { LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); if (LayoutInflater == null) { throw new AssertionError("LayoutInflater not found."); } return LayoutInflater; }
Activity 的 getLayoutInflater() 方法是调用 PhoneWindow 的getLayoutInflater()方法,源码:
public PhoneWindow(Context context) { super(context); mLayoutInflater = LayoutInflater.from(context); }
所以最终本质都是调用的是 (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
2>popupWindow = new PopupWindow(view, LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);这里的WRAP_CONTENT也可以换成MATCH_PARENT,或是具体数值,它指的是popuwindow的大小,也就是contentview的大小,注意popupwindow根据这个大小显示你的View,如果你的View本身是从xml得到的,那么xml的第一层view的大小属性将被忽略。所以这相当于popupWindow的width和height属性直接和第一层View相对应。
要设置具体数值,得额外在添加一层,如上布局LinearLayout中又加了LinearLayout进行宽高属性设置。
4.在3情况下,改下代码,在adapter中设置监听,添加一些方法:
在adapter中:
@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubViewHold hold=null;if(convertView==null){hold=new ViewHold();convertView = infate.inflate(R.layout.item,null);hold.tv=(TextView)convertView.findViewById(R.id.tv_name);convertView.setTag(hold);}hold=(ViewHold) convertView.getTag();hold.tv.setText(list.get(position));final String content = list.get(position);hold.tv.setOnLongClickListener(new OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {// TODO Auto-generated method stubif(onPressLongItemClik!=null){onPressLongItemClik.longPress(v,content);return true;}return false;}});return convertView;}public void setOnPressLongItemClik(OnPressLongItemClik onPressLongItemClik){this.onPressLongItemClik=onPressLongItemClik;}interface OnPressLongItemClik{void longPress(View view,String conttent);}使用类中:实现接口OnPressLongItemClik,设置监听,重写抽象方法longPress(View view,String content)即可
public class PopuwindowActivity1 extends Activity implements OnPressLongItemClik {private Button btn11;private ListView lv;private MyAdater1 adapter;private LayoutInflater infate;private View tipView;private PopupWindow popupWindow;private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_popuwindow);lv=(ListView)findViewById(R.id.listview);adapter=new MyAdater1(this, getData());//设置监听adapter.setOnPressLongItemClik(this);lv.setAdapter(adapter);}//实现接口@Overridepublic void longPress(View view,String content) {// TODO Auto-generated method stubif(popupWindow==null){infate=PopuwindowActivity1.this.getLayoutInflater();tipView =infate.inflate(R.layout.list_tip_menu, null);tv=(TextView)tipView.findViewById(R.id.tip_show);//PopupWindow(View contentView, int width, int height)//contentView为要显示的view,//width和height为宽和高,值为像素值,也可以是MATCHT_PARENT和WRAP_CONTENTpopupWindow=new PopupWindow(tipView, 200, 60);}tv.setText(content);popupWindow.setFocusable(true);popupWindow.setOutsideTouchable(true);popupWindow.setBackgroundDrawable(new BitmapDrawable());//相对view下方的位置,可以设置负值向相反方向移动,默认左上角为(0,0)//popupWindow.showAsDropDown(view, view.getWidth()/2,0-(3*view.getHeight())/2 ); int[] location = new int[2]; view.getLocationOnScreen(location); //在点击的item上方中间 view为item,根据view,popuWindown计算的他们的宽长,从而确定位置 popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0]+view.getWidth()/2-popupWindow.getWidth()/2, location[1]-popupWindow.getHeight()); //左方// popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0]-popupWindow.getWidth(), location[1]); //右边 //popupWindow.showAtLocation(view, Gravity.NO_GRAVITY, location[0]+v.getWidth(), location[1]);popupWindow.update();}private List<String> getData() {// TODO Auto-generated method stub List<String> datas = new ArrayList<String>();for (int i = 0; i < 100; i++) {datas.add("test数据"+i);}return datas;}
源码下载
- Android中PopupWindow的基本使用
- Android中PopupWindow的基本使用
- 关于android中PopupWindow的基本使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- Android中PopupWindow的使用
- PopupWindow的基本使用
- PopupWindow 的基本使用
- PopupWindow 的基本使用
- datatables增加跳转至指定页功能
- html 块级元素和行内元素
- 在与 SQL Server 建立连接时出现与网络相关的或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确并且 SQL Server 已配置为允许远程连接。
- 隐马尔科夫模型(HMM)学习笔记整理与思考
- linux下安装mysql
- Android中PopupWindow的基本使用
- datatables增加跳转至指定页功能(参考)
- Laravel5.0学习系类3之laravel文件目录介绍
- 在解决密码输入框里不能输入中文以及空格时所找到的解决方案
- 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185
- MySQL表结构为InnoDB类型从ibd文件恢复数据
- 小马哥----高仿苹果6 主板型号LT6082 芯片6582 真2g运存 15年新版山寨机型
- android四大组件(详细总结)
- 搭建服务器jenkins+sonar+maven的持续集成代码质量环境