做一個加入靈感集的操作,需要用戶註冊,彈出這麼一個PopupWindow的提示框。
要實現的功能很簡單,點擊稍後提醒以及鍵盤的返回鍵要能退出PopupWindow,爲了達到鼓勵用戶註冊的目的,點擊其他部分窗口不會消失,畢竟咱的目的是更多的用戶註冊不是,點擊返回鍵還能使其消失,畢竟返回鍵離手指頭更近。
當然,我會告訴你點擊其他部分怎麼讓它消失,以及怎麼鎖定後面的界面。往下看吧。
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就行了。