美文网首页
Fragment中的事件处理

Fragment中的事件处理

作者: Endeav0r | 来源:发表于2018-04-24 09:30 被阅读56次
    Fragment中没有onTouch方法,如何处理?

    在Activity中添加如下代码:

    public interface MyTouchListener {
        void onTouchEvent(MotionEvent event);
    }
    
    // 保存MyTouchListener接口的列表
    private List<MyTouchListener> myTouchListeners = new ArrayList<>();
    
    /**
     * 提供给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) {
        for (MyTouchListener listener : myTouchListeners) {
            listener.onTouchEvent(ev);
        }
        return super.dispatchTouchEvent(ev);
    }
    

    在Fragment中添加如下代码:

     // 将myTouchListener注册到分发列表
    getActivity()).registerMyTouchListener(myTouchListener);
    Activity.MyTouchListener myTouchListener = new Activity.MyTouchListener() {
        @Override
        public void onTouchEvent(MotionEvent event) {
            ...
        }
    };
    

    这样当有touchEvent发生时,MainActivity就会调用dispatchTouchEvent,dispatchTouchEvent接着对每一个注册的对象调用其onTouchEvent函数,也就是myTouchListener中实现的方法,这样Fragment里面就等于实现了onTouchEvent函数,只需要在函数体内实现处理的事件。

    Fragment中没有onBackPressed方法,如何处理?

    在Activity中:

    @Override
    public void onBackPressed() {
        if (!FragmentUtils.dispatchBackPress(getSupportFragmentManager())) {
            super.onBackPressed();
        }
    }
    

    在Fragment中:

    Fragment implements FragmentUtils.OnBackClickListener{
        ...
        @Override
        public boolean onBackClick() {
            TostUtil.show("onBackClick");
            if (mKeyBoardLayout.getVisibility() == View.VISIBLE) {
                hideKeyboard();
                return true; // true已经消耗了事件
            } else {
                return false;
            }
    
        }
    }
    

    参阅:

    android Fragment中没有onTouchEvent解决方法

    Fragment 点击事件的穿透和重叠bug

    相关文章

      网友评论

          本文标题:Fragment中的事件处理

          本文链接:https://www.haomeiwen.com/subject/qhydlftx.html