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