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感谢网友提供。