分发事件给注册了自定义接口的Fragment

需要实现点击fragment空白的地方来实现隐藏软键盘,首先在其所依附的activity中重写dispatchTouchEvent方法,并提供接口

//点击空白处,隐藏软键盘 回调接口
    public interface MyTouchListener {
        public void onTouchEvent(MotionEvent event);
    }

    /*
     * 保存MyTouchListener接口的列表
     */
    private ArrayList<MyTouchListener> myTouchListeners = new ArrayList<DDLiveBackgroundActivity.MyTouchListener>();

    /**
     * 提供给Fragment通过getActivity()方法来注册自己的触摸事件的方法
     *
     * @param listener
     */
    public void registerMyTouchListener(MyTouchListener listener) {
        myTouchListeners.add(listener);
    }

    /**
     * 提供给Fragment通过getActivity()方法来取消注册自己的触摸事件的方法
     *
     * @param listener
     */
    public void unRegisterMyTouchListener(MyTouchListener listener) {
        myTouchListeners.remove(listener);
    }

    /**
     * 分发触摸事件给所有注册了MyTouchListener的接口
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        boolean dispatch = super.dispatchTouchEvent(ev);
        for (MyTouchListener listener : myTouchListeners) {
            listener.onTouchEvent(ev);
        }
        return dispatch;
    }

在fragment的onResume方法中注册

DDLiveBackgroundActivity.MyTouchListener myTouchLinster = new DDLiveBackgroundActivity.MyTouchListener() {

            @Override
            public void onTouchEvent(MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    if (ETSettingH323Fragment.this.getActivity().getCurrentFocus() != null && ETSettingH323Fragment
                            .this.getActivity().getCurrentFocus().getWindowToken() != null) {
                        InputMethodManager manager = (InputMethodManager) ETSettingH323Fragment.this.getActivity()
                                .getSystemService(Context.INPUT_METHOD_SERVICE);
                        manager.hideSoftInputFromWindow(ETSettingH323Fragment.this.getActivity().getCurrentFocus()
                                .getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                    }
                }
            }
        };

        ((DDLiveBackgroundActivity) this.getActivity()).registerMyTouchListener(myTouchLinster);

记得在fragment的onPause方法中取消注册

 if (myTouchLinster != null) {
            ((DDLiveBackgroundActivity) this.getActivity()).unRegisterMyTouchListener(myTouchLinster);
            myTouchLinster = null;
        }

猜你喜欢

转载自blog.csdn.net/m0_37705108/article/details/83112655
今日推荐