Android 如何处理碎片上的触摸事件?

Android 如何处理碎片上的触摸事件?,android,android-fragments,touch-event,ontouchlistener,Android,Android Fragments,Touch Event,Ontouchlistener,我正在构建一个界面,我需要处理触摸事件。特别是,我希望能够使它们仅限于碎片中的一个受限区域。 为了更好地理解这个问题,尊重标准和我的应用程序的目标,我设计了导航抽屉,它假设存在许多片段(而不是活动)。带有触摸事件的活动很容易实现,另一方面,我在互联网上读到,带有碎片的可能会成为一个问题 我在架构级别的应用程序如下: -MainActivity.java -NavigationDrawer.java -java(对于现在正在等待解决问题的单个片段) 我还没有找到解释如何做好(或如何解决问题)的解决

我正在构建一个界面,我需要处理触摸事件。特别是,我希望能够使它们仅限于碎片中的一个受限区域。 为了更好地理解这个问题,尊重标准和我的应用程序的目标,我设计了导航抽屉,它假设存在许多片段(而不是活动)。带有触摸事件的活动很容易实现,另一方面,我在互联网上读到,带有碎片的可能会成为一个问题

我在架构级别的应用程序如下: -MainActivity.java -NavigationDrawer.java -java(对于现在正在等待解决问题的单个片段)

我还没有找到解释如何做好(或如何解决问题)的解决方案或教程。然后我要求您,将问题简化为“在片段中启用触摸事件(本例中为getPressure())”。下面是一些可能有助于解决此问题的代码:

TestFragment

public class TestFragment extends Fragment {
    private static final String ARG_SECTION_NUMBER = "section_number";

    public static TestFragment newInstance(int sectionNumber) {
        TestFragment fragment = new TestFragment();
        Bundle args = new Bundle();
        args.putInt(ARG_SECTION_NUMBER, sectionNumber);
        fragment.setArguments(args);
        return fragment;
    }

    public TestFragment() {}

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_test, container, false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // Here I want to return the press value (0 to 1)
    }
}
如何将侦听器与整个片段关联?在某个特定区域的情况下呢?最后,如何返回屏幕上的压力值


非常感谢您的建议!:)

我不确定我是否理解你的问题,但我会尽力回答这个问题。因此,为了获得碎片上的接触事件,我将执行以下操作:

-在片段onCreateView中:

View view = inflater.inflate(R.layout.fragment_test, container, false);

    view.setOnTouchListener(new View.OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {

                if(event.getAction() == MotionEvent.ACTION_MOVE){
                    //do something
                }
                return true;
            }
    });

//here the rest of your code

return view;
您可以在onTouch中检查不同的MotionEvents,例如:

MotionEvent.ACTION_DOWN, MotionEvent.ACTION_UP,...
在科特林:

override fun onCreateView(
    inflater: LayoutInflater, container: ViewGroup?,
    savedInstanceState: Bundle?
): View? {

   val view =  inflater.inflate(R.layout.fragment_img_view, container, false)

    view.setOnTouchListener(object : View.OnTouchListener {
        override fun onTouch(v: View?, event: MotionEvent): Boolean {
            if (event.action == MotionEvent.ACTION_MOVE) {
                scaleGestureDetector.onTouchEvent(event)
            }
            return true
        }
    })
    return view
}

谢谢!:)我已经完成了你写的,但是Android Studio说方法调用'view.setOnTouchListener(new view.OnTouchListener(){public boolean-onTouch(view v,[…]可能会产生空指针异常。您有办法解决此问题吗?我想您不必担心此警告,我在eclipse中使用过此方法,但它没有显示任何警告,而且我以这种方式使用它从来没有遇到过问题。@user3319400您也可以在片段中实现
onTouch
方法,并使用
view.setOnTouchListener(this)
澄清Ivan Black的评论:在片段的开头:
公共类YourFragmentName实现了View.OnTouchListener
。片段中的某个地方有一个方法
公共布尔onTouch(View v,MotionEvent event){…}
。然后用
视图.setOnTouchListener(this)将其挂接到视图
。我仍然运气不佳rootView.setOnTouchListener(新视图.OnTouchListener(){@Override public boolean onTouch(视图v,MotionEvent事件){if(event.getActionMasked()==MotionEvent.ACTION\u DOWN){Toast.makeText(getActivity(),“您只需触摸屏幕:-)”,Toast.LENGTH_SHORT).show();}return true;}}});顺便说一句,在我的公司里,我们有一个
类MainActivity extensed Activity
,和许多片段。我们遇到的一个主要问题是:我们无法获得片段的导航堆栈(也称为back stack)以我们想要的方式工作(我认为iOS做得更好),所以我们最终在自己的代码中管理片段和后退按钮。也就是说,我们跟踪片段,当按下后退按钮时,我们自己决定返回到哪里。(如果片段a链接到子片段B1,子片段B1链接到兄弟/对等片段B2,我们希望在有意义的地方返回到a,而不是B1)我认为这个问题的一个答案是: