天天看点

Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例

一.PopupWindow的基本概念

      PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义显示,并且里面的监听组件,进行相应的操作,但它与Dialog又有很大的区别,PopupWindow只是弹出窗口,不会使宿主Activity组件失去焦点,也就是说PopupWindow弹出后,你仍可以与宿主Activity进行交互,Dialog却不能做到这一点。

二.PopupWindow的相关方法

(一)构造方法

PopupWindow有几种构造方法,常用的为

1. public PopupWindow(Context context);

//给定一个上下文,当我们设置了setOutsideTouchable为true时,在触摸到弹框外部后自动关闭。但是这个构造方法必须去指定显示的布局,布局的宽高,焦点。

2. public PopupWindow(View contentView, int width, int height, boolean focusable)

//给定一个布局。宽,高和焦点,但是在了setOutsideTouchable为true时,触摸到弹框外部也不能自动关闭,必须去指定背景,一般使用window.setBackgroundDrawable(new Co

lorDrawable(0x00000000))

(二)操作PopupWindow对象的常用方法

  1. setOutsideTouchable(boolean);

    //指定设置显示PopuWindow之后在外面点击是否有效。

  2. setFocusable(boolean);//指定是否获取焦点
  3. setBackgroundDrawable(new ColorDrawable(0));//没有上下文时必须指定,否者setOutsideTouchable无效
  4. showAsDropDown(anchor, 0, 0);//设置显示PopupWindow的位置位于View的左下方,x,y表示坐标偏移量

    5.showAtLocation(findViewById(R.id.parent), Gravity.LEFT, 0, -90);

    //(以某个View为参考),表示弹出窗口以parent组件为参考,位于左侧,偏移-90。

    6.dismiss(); //关闭窗口

    7.setOnDismissListenerd(new PopupWindow.OnDismissListener(){})

    //设置窗口消失的监听事件事件

三.PopupWindow示例

本程序显示页面的效果如下:

Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例

      简单说明:页面布局设计一个RelativeLayout包裹EditText和ImageView,点击ImageView之后,显示PopupWindow窗体,点击PopupWindow里面的内容,对应的数据就会显示在EditText上。

使用PopupWindow要加载一个View,这里使用的是ListView,所以要创建适配器显示列表信息。

(一)布局文件设计

1.activity_main.xml文件设计

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.lwz.popupwindow.MainActivity">

    <RelativeLayout
        android:id="@+id/main_rl"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:background="@drawable/back"
        android:padding="5dp">

        <EditText
            android:id="@+id/main_et"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@null"
            android:hint="输入号码"
            android:inputType="number" />

        <ImageView
            android:id="@+id/main_iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:src="@mipmap/down_arrow" />
    </RelativeLayout>

</RelativeLayout>
           

2.PopupWindow窗体的布局文件item_popup.xml设计

<?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:gravity="center"
    android:orientation="horizontal">

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:src="@mipmap/user" />

    <TextView
        android:id="@+id/tv_phone"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:text="电话" />

    <ImageView
        android:id="@+id/iv_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:src="@mipmap/delete" />
</LinearLayout>
           

(二)java代码设计

package com.lwz.popupwindow;

import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.RelativeLayout;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    //定义布局内的控件
    ImageView imageView;
    EditText editText;
    RelativeLayout relativeLayout;
    //定义数据源的集合
    List<String> list = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();


    }

    //实例化数据
    private void initView() {
        //给数据源添加数据
        for (int i = ; i < ; i++) {
            list.add("12345345" + i);
        }
        //实例化数据
        editText = (EditText) findViewById(R.id.main_et);
        imageView = (ImageView) findViewById(R.id.main_iv);
        relativeLayout = (RelativeLayout) findViewById(R.id.main_rl);

        //给下拉的图像设置监听事件
        imageView.setOnClickListener(this);


    }

    //定义一个PopupWindow对话框的对象
    PopupWindow pw;

    //点击下拉图像的回调方法
    @Override
    public void onClick(View v) {
        //显示Popup对话框,需要传入一个View对象
        ListView listview = new ListView(this);
        listview.setAdapter(adapter);
        //创建PopupWIndow实例化对象
        //第一个参数是代表View对象,这里传入一个列表的ListView对象
        //第二个参数代表宽度,这里的宽度是包裹EditText控件的相对布局的宽度
        //第三个参数代表高度,
        //第四个代表是否可以聚焦
        pw = new PopupWindow(listview, relativeLayout.getWidth(), , true);
        //设置点击外部后,Popup页面消失
        pw.setOutsideTouchable(true);
        //设置背景颜色
        pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
        //设置PopupWindow的位置,并显示PopupWindow页面
        //第一个参数代表PopupWindow在哪个控件的下方
        //第二个参数代表PopupWindow在x轴上和对应控件的距离差
        //第三个参数代表PopupWindow在y轴上和对应控件的距离差
        pw.showAsDropDown(relativeLayout, , );

        //给ListView设置监听事件,这里点击ListView的对应条目后把它的数据显示在EditText上面
        listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                editText.setText(list.get(position));
                //关闭窗口
                pw.dismiss();
            }
        });

    }

    //创建适配器对象,并进行实例化
    BaseAdapter adapter = new BaseAdapter() {

        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public String getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            //定义ViewHolder对象
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = View.inflate(MainActivity.this, R.layout.item_popup, null);
                viewHolder = new ViewHolder(convertView);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            //现在ViewHolder有值了 !
            //可以对ViewHolder里面的对象进行操作了,主要是填充数据
            viewHolder.tv.setText(list.get(position));
            //给Imageview对象设置监听事件
            viewHolder.iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //点击删除图标后,删除这行信息
                    list.remove(position);
                    //刷新适配器
                    adapter.notifyDataSetChanged();
                }
            });
            return convertView;
        }
    };

    class ViewHolder {
        ImageView iv;
        TextView tv;

        //通过构造方法传入一个View对象
        ViewHolder(View convertView) {
            iv = (ImageView) convertView.findViewById(R.id.iv_delete);
            tv = (TextView) convertView.findViewById(R.id.tv_phone);
        }


    }

}
           

(三)程序运行结果

1.程序刚运行显示的界面:

Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例

2.点击右边的图标后显示的界面:

Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例

3.点击PopupWindow的一个条目后显示的界面:

Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例

总结:

      PopupWindow的使用并不困难,跟Dialog的使用和功能都是很相近的。

      PopupWindow的使用主要是在显示菜单信息或在某个控件下方显示列表信息。Dialog对话框一般是显示在屏幕的中心。

      PopupWindow和Dialog有一个区别就是:

弹出PopupWindow,页面的生命周期的方法没有被回调;

弹出Dialog,页面的生命周期的方法Pause肯定被回调;

菜单效果的PopupWindow,如图

Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例
Android PopupWindow使用总结一.PopupWindow的基本概念二.PopupWindow的相关方法三.PopupWindow示例

这些都是PopupWindow窗口经常使用的场合。