PopupWindow的isShowing()方法總是返回false的原因及解決方法

問題:

    在使用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
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章