PopupWindow有点类似于Dialog,相同点在于都是弹出窗口,并且都可以对其进行自定义显示,并且里面的监听组件,进行相应的操作,但它与Dialog又有很大的区别,PopupWindow只是弹出窗口,不会使宿主Activity组件失去焦点,也就是说PopupWindow弹出后,你仍可以与宿主Activity进行交互,Dialog却不能做到这一点。
PopupWindow有几种构造方法,常用的为
//给定一个上下文,当我们设置了setOutsideTouchable为true时,在触摸到弹框外部后自动关闭。但是这个构造方法必须去指定显示的布局,布局的宽高,焦点。
//给定一个布局。宽,高和焦点,但是在了setOutsideTouchable为true时,触摸到弹框外部也不能自动关闭,必须去指定背景,一般使用window.setBackgroundDrawable(new Co
lorDrawable(0x00000000))
本程序显示页面的效果如下:
简单说明:页面布局设计一个RelativeLayout包裹EditText和ImageView,点击ImageView之后,显示PopupWindow窗体,点击PopupWindow里面的内容,对应的数据就会显示在EditText上。
使用PopupWindow要加载一个View,这里使用的是ListView,所以要创建适配器显示列表信息。
<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>
<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>
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 list = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
//实例化数据
private void initView() {
//给数据源添加数据
for (int i = 0; i < 10; 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(), 200, true);
//设置点击外部后,Popup页面消失
pw.setOutsideTouchable(true);
//设置背景颜色
pw.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
//设置PopupWindow的位置,并显示PopupWindow页面
//第一个参数代表PopupWindow在哪个控件的下方
//第二个参数代表PopupWindow在x轴上和对应控件的距离差
//第三个参数代表PopupWindow在y轴上和对应控件的距离差
pw.showAsDropDown(relativeLayout, 0, 50);
//给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.程序刚运行显示的界面:
2.点击右边的图标后显示的界面:
3.点击PopupWindow的一个条目后显示的界面:
总结:
PopupWindow的使用并不困难,跟Dialog的使用和功能都是很相近的。
PopupWindow的使用主要是在显示菜单信息或在某个控件下方显示列表信息。Dialog对话框一般是显示在屏幕的中心。
PopupWindow和Dialog有一个区别就是:
弹出PopupWindow,页面的生命周期的方法没有被回调;
弹出Dialog,页面的生命周期的方法Pause肯定被回调;