• PopupWindow简单使用


    如图是效果图

    当点击 “点我”的按钮是   会弹出 如图的 弹窗

    补充为PopupWindow设置一个显示动画和消失的动画

    先在anim的文件下分别设置显示和消失的动画

    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android" >
    
        <translate
            android:duration="500"
            android:fromXDelta="0%"
            android:toXDelta="0%"
            android:fromYDelta="100%"
            android:toYDelta="0%" />
           <!--  <alpha
                android:fromAlpha="0.0"
                android:toAlpha="1.0"
                android:duration="500"
                android:startOffset="500"/> -->
    
    </set>
    <?xml version="1.0" encoding="utf-8"?>
    <set xmlns:android="http://schemas.android.com/apk/res/android">    
        <translate    
            android:fromXDelta="0"    
            android:toXDelta="0"    
            android:fromYDelta="0"    
            android:toYDelta="100%"    
            android:duration="500" />    
    </set> 
    View Code

    再在style内写其他的

        <style name="popwin_anim_style">
            <item name="android:windowEnterAnimation">@anim/popshow</item>
            <item name="android:windowExitAnimation">@anim/pophide</item>
        </style>
                //创建PopupWindow实例,同时传入弹出窗口的显示高度和宽度以及是否设置焦点
                popupWindow = new PopupWindow(infView,LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT,true);
                //如果不设置PopupWindow背景,无论是点击外部区域还是Back键都没法dismiss弹窗
                popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
                //设置显示的动画
                popupWindow.setAnimationStyle(R.style.popwin_anim_style);

    主代码如下    布局xml  就是只有一个 Button

     1 package org.xml.popdemo;
     2 
     3 import ogg.huanxin.huadong.R;
     4 import android.app.Activity;
     5 import android.os.Bundle;
     6 import android.view.View;
     7 import android.view.View.OnClickListener;
     8 import android.widget.Button;
     9 
    10 public class MainPopWindow extends Activity implements OnClickListener {
    11     private Button popButton;
    12     private PopWindowForAttr popWindowForAttr;
    13 
    14     @Override
    15     protected void onCreate(Bundle savedInstanceState) {
    16         // TODO Auto-generated method stub
    17         super.onCreate(savedInstanceState);
    18         super.setContentView(R.layout.main_popwindow);
    19         popButton=(Button)super.findViewById(R.id.popbutton);
    20         popButton.setOnClickListener(this);
    21         popWindowForAttr = new PopWindowForAttr(this);
    22     }
    23 
    24     @Override
    25     public void onClick(View v) {
    26         // TODO Auto-generated method stub
    27         switch (v.getId()) {
    28         case R.id.popbutton:
    29             popWindowForAttr.showAsDropDown(v);
    30             break;
    31         default:
    32             break;
    33 
    34         }
    35     }
    36 }
      1 package org.xml.popdemo;
      2 
      3 import ogg.huanxin.huadong.R;
      4 import android.app.ActionBar.LayoutParams;
      5 import android.content.Context;
      6 import android.graphics.Color;
      7 import android.graphics.drawable.ColorDrawable;
      8 import android.view.Gravity;
      9 import android.view.LayoutInflater;
     10 import android.view.View;
     11 import android.view.View.OnClickListener;
     12 import android.widget.Button;
     13 import android.widget.ImageButton;
     14 import android.widget.PopupWindow;
     15 import android.widget.TextView;
     16 import android.widget.Toast;
     17 import android.widget.PopupWindow.OnDismissListener;
     18 
     19 public class PopWindowForAttr implements OnClickListener, OnDismissListener {
     20     private Context context;
     21     private PopupWindow popupWindow;
     22     private Button addCart, doCart;
     23     private final int AddReduce = 1;
     24     private TextView Popreduce, Popnum, Popadd;
     25     private ImageButton deleteButton;
     26 
     27     public PopWindowForAttr(Context context) {
     28         this.context = context;
     29         // 自定义的一个控件作为显示内容
     30         View contentView = LayoutInflater.from(context).inflate(
     31                 R.layout.popupwindowdemo, null);
     32         //
     33         addCart = (Button) contentView.findViewById(R.id.addCart);
     34         doCart = (Button) contentView.findViewById(R.id.doCart);
     35         Popreduce = (TextView) contentView.findViewById(R.id.pop_reduce);
     36         Popnum = (TextView) contentView.findViewById(R.id.pop_num);
     37         Popadd = (TextView) contentView.findViewById(R.id.pop_add);
     38         deleteButton = (ImageButton) contentView.findViewById(R.id.delete);
     39         // 各组件绑定事件
     40         addCart.setOnClickListener(this);
     41         doCart.setOnClickListener(this);
     42         Popreduce.setOnClickListener(this);
     43         Popadd.setOnClickListener(this);
     44         deleteButton.setOnClickListener(this);
     45         // 将加载的视图view载入PopubWindow,并且设置popupwindow这个组件的动画效果
     46         popupWindow = new PopupWindow(contentView, LayoutParams.MATCH_PARENT,
     47                 LayoutParams.WRAP_CONTENT, true);
     48         // 如果不设置PopupWindow的背景,无论是点击外部区域还是Back键都无法dismiss弹框
     49         popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
     50         // 当popWindow消失时的监听
     51         popupWindow.setOnDismissListener(this);
     52     }
     53 
     54     public void showAsDropDown(View v) {
     55         // showAsDropDown(View anchor):相对某个控件的位置(正左下方),无偏移
     56         // showAsDropDown(View anchor, int xoff, int yoff):相对某个控件的位置,有偏移
     57         // showAtLocation(View parent, int gravity, int x, int
     58         // y):相对于父控件的位置(例如正中央Gravity.CENTER,下方Gravity.BOTTOM等),可以设置偏移或无偏移
     59         popupWindow.showAtLocation(v, Gravity.BOTTOM, 100, 100);
     60         // 设置setFocusable(true),要不然点击弹窗其他地方以及返回键,弹窗都不会退出
     61         // 也才能让popupWindow里面的布局控件获得点击的事件,否则就被它的父亲view给拦截了
     62         popupWindow.setFocusable(true);
     63         //这个方法时设置popupWindow以外的区域可以相应触摸事件,比如我们重写了触摸事件去做一些别的操作,但首先Focusable是true。
     64         popupWindow.setOutsideTouchable(true);
     65         popupWindow.update();
     66 
     67     }
     68 
     69     // 销毁
     70     @Override
     71     public void onDismiss() {
     72         // TODO Auto-generated method stub
     73         popupWindow.dismiss();
     74     }
     75 
     76     @Override
     77     public void onClick(View arg0) {
     78         // TODO Auto-generated method stub
     79         switch (arg0.getId()) {
     80         case R.id.addCart:
     81             Toast.makeText(context, "添加到购物车", Toast.LENGTH_SHORT).show();
     82             break;
     83         case R.id.doCart:
     84             Toast.makeText(context, "立即购买", Toast.LENGTH_SHORT).show();
     85             break;
     86         case R.id.delete:
     87             onDismiss();
     88             break;
     89         case R.id.pop_reduce:
     90             if (!Popnum.getText().toString().equals("1")) {
     91                 String num_ReduceString = Integer.valueOf(Popnum.getText()
     92                         .toString()) - AddReduce + "";
     93                 Popnum.setText(num_ReduceString);
     94             } else {
     95                 Toast.makeText(context, "您买入的数量不能低于1", Toast.LENGTH_SHORT)
     96                         .show();
     97             }
     98             break;
     99         case R.id.pop_add:
    100             if (!Popnum.getText().toString().equals("1000")) {
    101                 String numString = Integer.valueOf(Popnum.getText().toString())
    102                         + AddReduce + "";
    103                 Popnum.setText(numString);
    104             }
    105             break;
    106         default:
    107             break;
    108         }
    109     }
    110 }
      1 <?xml version="1.0" encoding="utf-8"?>
      2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      3     android:layout_width="match_parent"
      4     android:layout_height="match_parent"
      5     android:background="#FFFFFF"
      6     android:orientation="vertical"
      7     android:paddingLeft="15dp"
      8     android:paddingRight="15dp" >
      9 
     10     <LinearLayout
     11         android:layout_width="match_parent"
     12         android:layout_height="wrap_content"
     13         android:layout_gravity="center_vertical"
     14         android:layout_marginTop="10dp" >
     15 
     16         <ImageView
     17             android:layout_width="50dp"
     18             android:layout_height="50dp"
     19             android:scaleType="fitCenter"
     20             android:src="@drawable/d" />
     21 
     22         <LinearLayout
     23             android:layout_width="wrap_content"
     24             android:layout_height="match_parent"
     25             android:layout_marginLeft="10dp"
     26             android:layout_weight="1"
     27             android:orientation="vertical" >
     28 
     29             <TextView
     30                 android:layout_width="wrap_content"
     31                 android:layout_height="wrap_content"
     32                 android:gravity="center_vertical"
     33                 android:text="现售价:¥49.00"
     34                 android:textSize="15sp" />
     35 
     36             <TextView
     37                 android:id="@+id/kucun"
     38                 android:layout_width="wrap_content"
     39                 android:layout_height="wrap_content"
     40                 android:gravity="center_vertical"
     41                 android:paddingTop="4dp"
     42                 android:text="库存为:987"
     43                 android:textSize="12sp" />
     44         </LinearLayout>
     45 
     46         <ImageButton
     47             android:layout_width="wrap_content"
     48             android:layout_height="wrap_content"
     49             android:id="@+id/delete"
     50             android:layout_weight="1"
     51             android:background="@null"
     52             android:padding="4dp"
     53             android:src="@drawable/delete" />
     54     </LinearLayout>
     55 
     56     <LinearLayout
     57         android:layout_width="wrap_content"
     58         android:layout_height="wrap_content"
     59         android:background="#eee"
     60         android:orientation="horizontal" >
     61 
     62         <TextView
     63             android:layout_width="0dp"
     64             android:layout_height="wrap_content"
     65             android:layout_weight="1"
     66             android:padding="1dp"
     67             android:text="购买数量" />
     68 
     69         <TextView
     70             android:id="@+id/pop_reduce"
     71             android:layout_width="wrap_content"
     72             android:layout_height="wrap_content"
     73             android:paddingBottom="10dp"
     74             android:paddingLeft="12dp"
     75             android:paddingRight="12dp"
     76             android:paddingTop="10dp"
     77             android:text="-"
     78             android:color="#000000" />
     79 
     80         <TextView
     81             android:id="@+id/pop_num"
     82             android:layout_width="60dp"
     83             android:layout_height="wrap_content"
     84             android:gravity="center"
     85             android:padding="10dp"
     86             android:text="1"
     87             android:textColor="#000000" />
     88 
     89         <TextView
     90             android:id="@+id/pop_add"
     91             android:layout_width="wrap_content"
     92             android:layout_height="wrap_content"
     93             android:paddingBottom="10dp"
     94             android:paddingLeft="12dp"
     95             android:paddingRight="12dp"
     96             android:paddingTop="10dp"
     97             android:text="+"
     98             android:textColor="#000000" />
     99     </LinearLayout>
    100 
    101     <LinearLayout
    102         android:layout_width="wrap_content"
    103         android:layout_height="wrap_content" >
    104 
    105         <Button
    106             android:id="@+id/addCart"
    107             android:layout_width="wrap_content"
    108             android:layout_height="wrap_content"
    109             android:layout_weight="1"
    110             android:background="@drawable/png_3"
    111             android:paddingBottom="10dp"
    112             android:paddingLeft="20dp"
    113             android:paddingRight="20dp"
    114             android:paddingTop="10dp"
    115             android:text="加入购物车"
    116             android:textColor="@android:color/white" />
    117 
    118         <Button
    119             android:id="@+id/doCart"
    120             android:layout_width="wrap_content"
    121             android:layout_height="wrap_content"
    122             android:layout_weight="1"
    123             android:background="@drawable/png_3"
    124             android:paddingBottom="10dp"
    125             android:paddingLeft="20dp"
    126             android:paddingRight="20dp"
    127             android:paddingTop="10dp"
    128             android:text="立即购买"
    129             android:textColor="@android:color/white" />
    130     </LinearLayout>
    131 
    132 </LinearLayout>
    View Code

     另外一种常见的方式  当点击一个下拉箭头  会出现的一个popowind 如下拉选择

    下拉选择

      1 假如listview的item中有Button,ImageButton,CheckBox等会强制获取焦点的view,这时listview的item无法获取焦点,从而无法被点击 

    解决方法    在item的根布局增加以下的属性android:descendantFocusability="blocksDescendants"设置后,Button获取焦点,item中的其他控件页可以获取焦点了

    如下是主要代码

      1 package com.ithello.xiala;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 
      6 import android.app.Activity;
      7 import android.graphics.drawable.BitmapDrawable;
      8 import android.os.Bundle;
      9 import android.util.Log;
     10 import android.view.View;
     11 import android.view.View.OnClickListener;
     12 import android.view.ViewGroup;
     13 import android.widget.AdapterView;
     14 import android.widget.AdapterView.OnItemClickListener;
     15 import android.widget.BaseAdapter;
     16 import android.widget.EditText;
     17 import android.widget.ImageView;
     18 import android.widget.ListView;
     19 import android.widget.PopupWindow;
     20 import android.widget.TextView;
     21 
     22 /**
     23  * 实现下拉选择的控件
     24  * 
     25  * @author Administrator
     26  * 
     27  */
     28 public class MainActivity extends Activity implements OnClickListener {
     29     /**文本编辑框*/
     30     private EditText editText;
     31     /**下拉的图标点击可以出现弹窗*/
     32     private ImageView imageView;
     33     /**弹窗中的list数据*/
     34     private List<String> list = new ArrayList<String>();
     35     /***/
     36     private ListView listView;
     37     /**弹窗PopupWindow*/
     38     private PopupWindow popupWindow;
     39     /**弹窗PopupWindow的默认高度*/
     40     private int popupWindowHight = 300;
     41 
     42     @Override
     43     protected void onCreate(Bundle savedInstanceState) {
     44         // TODO Auto-generated method stub
     45         super.onCreate(savedInstanceState);
     46         setContentView(R.layout.mainactivity);
     47         setView();
     48         setData();
     49     }
     50 
     51     private void setView() {
     52         // TODO Auto-generated method stub
     53         editText = (EditText) findViewById(R.id.edt_main);
     54         imageView = (ImageView) findViewById(R.id.iv);
     55 
     56         imageView.setOnClickListener(this);
     57     }
     58 
     59     private void setData() {
     60         // TODO Auto-generated method stub
     61         // 初始化数据
     62         for (int i = 0; i < 15; i++) {
     63             list.add(900000 + i + "");
     64         }
     65 
     66         listView = new ListView(this);
     67         listView.setVerticalScrollBarEnabled(false);// 隐藏listview的滚动条
    listView.setBackgroundColor(Color.parseColor("#E6E6E6"));
    listView.setDivider(new ColorDrawable(Color.WHITE));
             listView.setDividerHeight(1); 68 MyAdapter adapter = new MyAdapter(); 69 listView.setAdapter(adapter); 70 71 listView.setOnItemClickListener(new OnItemClickListener() { 72 73 @Override 74 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 75 long arg3) { 76 // TODO Auto-generated method stub 77 Log.d("jiejie", arg2 + ""); 78 editText.setText(list.get(arg2)); 79 popupWindow.dismiss(); 80 } 81 }); 82 } 83 84 /** 85 * 显示一个PopupWindow 86 */ 87 private void showNumPopu() { 88 if (popupWindow == null) { 89 popupWindow = new PopupWindow(listView, editText.getWidth(), 90 popupWindowHight); 91 } 92 // 要让其中的view获取焦点,必须设置为true 93 popupWindow.setFocusable(true); 94 // 还必须设置一个背景图片 95 popupWindow.setBackgroundDrawable(new BitmapDrawable()); 96 // 设置点击外部点击消失 97 popupWindow.setOutsideTouchable(true); 98 popupWindow.showAsDropDown(editText, 0, 0); 99 } 100 101 @Override 102 public void onClick(View arg0) { 103 // TODO Auto-generated method stub 104 switch (arg0.getId()) { 105 case R.id.iv: 106 showNumPopu(); 107 break; 108 109 default: 110 break; 111 } 112 } 113 114 // list的适配器 115 private class MyAdapter extends BaseAdapter { 116 117 @Override 118 public int getCount() { 119 // TODO Auto-generated method stub 120 return list.size(); 121 } 122 123 @Override 124 public Object getItem(int arg0) { 125 // TODO Auto-generated method stub 126 return arg0; 127 } 128 129 @Override 130 public long getItemId(int arg0) { 131 // TODO Auto-generated method stub 132 return arg0; 133 } 134 135 @Override 136 public View getView(final int position, View arg1, ViewGroup arg2) { 137 // TODO Auto-generated method stub 138 final View view = View.inflate(MainActivity.this, 139 R.layout.item_list, null); 140 TextView tv_number = (TextView) view.findViewById(R.id.item_text); 141 ImageView iv_delete = (ImageView) view 142 .findViewById(R.id.item_image); 143 tv_number.setText(list.get(position)); 144 iv_delete.setOnClickListener(new OnClickListener() { 145 146 @Override 147 public void onClick(View arg0) { 148 // TODO Auto-generated method stub 149 Log.d("jiejie", "position " + position); 150 list.remove(position); 151 notifyDataSetChanged(); 152 int listviewHeight = view.getHeight() * list.size(); 153 popupWindow.update( 154 editText.getWidth(), 155 listviewHeight > popupWindowHight ? popupWindowHight 156 : listviewHeight); 157 158 if (list.size() == 0) { 159 imageView.setVisibility(View.INVISIBLE); 160 popupWindow.dismiss(); 161 } 162 163 } 164 }); 165 return view; 166 } 167 168 } 169 }
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#000"
        android:orientation="vertical" >
    
        <RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp" >
    
            <EditText
                android:id="@+id/edt_main"
                android:layout_width="180dp"
                android:layout_height="40dp"
                android:hint=""
                android:background="#fff"
                android:paddingRight="20dp" />
    
            <ImageView
                android:id="@+id/iv"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignRight="@id/edt_main"
                android:layout_centerVertical="true"
                android:contentDescription="@null"
                android:padding="5dp"
                android:src="@drawable/spread" />
        </RelativeLayout>
    
    </LinearLayout>
  • 相关阅读:
    Leetcode OJ: Rotate List
    Leetcode OJ: Reverse Words in a String
    Effective C++读书笔记
    word改变下划线与文字的距离
    sql 取出表中不重复的值
    Iso文件用utrliso怎么安装
    Spring注入aspectJ切面
    Spring中利用java注解声明切面
    Spring面向切面编程
    spring中部分异常
  • 原文地址:https://www.cnblogs.com/wangfengdange/p/4898894.html
Copyright © 2020-2023  润新知