android PopupWindow 使用

PopupWindow的创建:

创建布局:offline_alldoc

<?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:orientation="vertical" >
    <LinearLayout
        android:id="@+id/ll_oa_alldoc"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:background="@drawable/offline_popupbg">
        <ImageView
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/alldoc"/>
        <TextView
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="全部文档"
            android:textSize="20sp"
            android:textColor="@color/white"/>
    </LinearLayout>
    <LinearLayout
        android:id="@+id/ll_oa_bddoc"
        android:layout_width="wrap_content"
        android:layout_height="45dp"
        android:orientation="horizontal"
        android:gravity="center_vertical"
        android:background="@drawable/offline_popupbg">
        <ImageView
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/bddoc"/>
        <TextView
            android:layout_marginLeft="10dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="本地文档"
            android:textSize="20sp"
            android:textColor="@color/white"/>
    </LinearLayout>

</LinearLayout>

 

在窗体中实现:

private void showPopupWindow(int x, int y) {
		if(popupWindow !=null){
			popupWindow.dismiss();
		}
		View popupView = View.inflate(getActivity(),
				R.layout.offline_alldoc, null);
		LinearLayout ll_all = (LinearLayout) popupView
				.findViewById(R.id.ll_oa_alldoc);
		LinearLayout ll_bd = (LinearLayout) popupView
				.findViewById(R.id.ll_oa_bddoc);
		ll_all.setOnClickListener(this);
		ll_bd.setOnClickListener(this);
		
		if("本地文档".equals(tv_change.getText())){
			ll_all.setBackgroundResource(R.drawable.offline_popupbg1);
		}else{
			ll_bd.setBackgroundResource(R.drawable.offline_popupbg1);
		}
		
		// 创建显示动画
		ScaleAnimation sa = new ScaleAnimation(1.0f, 1.0f, 0.0f, 1.0f);
		sa.setDuration(200);
		
		// 创建一个窗体
		popupWindow = new PopupWindow(popupView, 250, 160);
		popupWindow.setBackgroundDrawable(new BitmapDrawable());
		//不可操作界面其他区域
		popupWindow.setFocusable(true);
		
		popupWindow.showAtLocation(getView(), Gravity.LEFT | Gravity.TOP, x,
				y);
		popupView.startAnimation(sa);
	}


 


PopupWindow出现之后,默认的是所有的操作都无效的,除了HOME键。而且是可以操作后面的界面的。

想要锁定后面的界面,很简单,只需要让PopupWindow是focusable的。


popupWindow.setFocusable(true);

这样,显示的时候,popupWindow获取啦焦点,后面的内容为非活动。

但是这样不能实现点击屏幕其他部分使其消失,返回键也不行。

这时候要给popupWindow设置一个一个BackgroundDrawable,如果你已经定义好布局,怕破坏掉样式,只需要设置一个空的Drawable即可。


popupWindow.setBackgroundDrawable(new PaintDrawable());

这样,点击屏幕其他部分和返回键都能实现使其消失的功能了。

我的情况和上面都不一样,不能让用户点一下屏幕其他地方就消失了,人家想注册呢,不小心碰到屏幕其他地方了,一下就没了,我可能就少了一个注册用户。

我要实现的仅仅是返回键使popupwindow消失。这里需要重写view的onKeyListener,这个view应该是popwindow的view,当然是最parent的那个view。上代码。


View layout = inflater.inflate(R.layout.account_dialog,
		(ViewGroup) activity.findViewById(R.id.account_dialog));
layout.setFocusable(true); // 这个很重要
layout.setFocusableInTouchMode(true);

popupWindow = new PopupWindow(layout);
popupWindow.setFocusable(true);

// 重写onKeyListener
layout.setOnKeyListener(new OnKeyListener() {
	@Override
	public boolean onKey(View v, int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			accountDialog.dismiss();
			accountDialog = null;
			return true;
		}
		return false;
	}
});

看明白了吗?

要让生成popupwindow的那个view也是focusable的,保险起见,设置FocusableInTouchMode也为true。

这样再重写那个view的onKeyListener就行了。

 

上面的点击返回 关闭 popupwindow感谢网友提供。

PopupWindow是一种可以在当前界面上方显示的弹出窗口,通常用于显示一些额外的信息或者提供用户操作的选项。在Android中,可以使用PopupWindow类来创建弹出窗口。 以下是使用PopupWindow的一般步骤: 1. 创建PopupWindow对象:使用PopupWindow的构造函数创建一个PopupWindow对象。 2. 设置PopupWindow的属性:设置PopupWindow的大小、位置、背景等属性。 3. 设置PopupWindow的内容视图:使用setContentView方法设置PopupWindow的内容视图,这可以是一个布局文件或者一个View对象。 4. 显示PopupWindow使用showAsDropDown、showAtLocation等方法显示PopupWindow。 5. 处理PopupWindow的事件:设置PopupWindow的监听器,处理PopupWindow的各种事件。 以下是一个简单的例子,展示如何使用PopupWindow: ``` // 创建PopupWindow对象 PopupWindow popupWindow = new PopupWindow(context); // 设置PopupWindow的属性 popupWindow.setWidth(WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setHeight(WindowManager.LayoutParams.WRAP_CONTENT); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.setFocusable(true); // 设置PopupWindow的内容视图 View contentView = LayoutInflater.from(context).inflate(R.layout.popup_layout, null); popupWindow.setContentView(contentView); // 显示PopupWindow popupWindow.showAsDropDown(anchorView); // 处理PopupWindow的事件 contentView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理点击事件 popupWindow.dismiss(); } }); ``` 在上面的代码中,我们创建了一个PopupWindow对象,并设置了宽高、背景等属性。然后,我们使用LayoutInflater加载了一个布局文件作为PopupWindow的内容视图,并使用setContentView方法设置了PopupWindow的内容视图。最后,我们使用showAsDropDown方法显示了PopupWindow,并设置了一个点击事件处理器来处理用户点击PopupWindow的事件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值