問題:
在使用PopupWindow時,通常需要通過其isShowing()方法來判斷PopupWindow顯示與隱藏,然而isShowing()如果不注意使用,就會得到總是返回false的結果。
原因:
當我們通過點擊其他組件(如按鈕)觸發PopupWindow時,焦點聚焦在那個組件上而不在PopupWindow的視圖裏,由此造成系統認爲PopupWindow對象是隱藏的,因此一直返回false。
解決方法:
既然知道isShowing()一直返回false的原因,那麼我們讓PopupWindow顯示的時候讓它獲得焦點就好了。
在PopupWindow中有public void setFocusable(boolean focusable)
是用來獲得焦點的,而public void setTouchable(boolean touchable)
是用來設置是否接受觸摸事件的,這個可加可不加。
另外,如果你需要點擊PopupWindow視圖外的區域也可以因此PopupWindow視圖的話,建議加上這個方法public void setOutsideTouchable(boolean touchable)
,這樣可以讓程序更加穩定。
示例:
public class Example extends Activity implements View.OnClickListener{
private PopupWindow menu;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
findViewById(R.id.btn).setOnClickListener(this::onClick);//關聯PopupWindow的按鈕
View view = getLayoutInflater().inflate(R.layout.unlockmenu,null,false);//獲取需要加到PopupWindow的視圖
menu = new PopupWindow(view,500,300);//綁定視圖並設置PopupWindow的長寬
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.btn){
if (menu.isShowing()){//判斷PopupWindow是否是顯示的
menu.dismiss();//隱藏PopupWindow
}
else {
menu.showAsDropDown(v,200,100);//顯示PopupWindow,v是相對哪個view來顯示,第二第三個參數是相對第一個參數v視圖的位置偏移量
menu.setFocusable(true);//獲取焦點
menu.setTouchable(true);//設置可觸摸
menu.setOutsideTouchable(true);//設置觸摸區域外可隱藏PopupWindow
}
}
}
}