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