底部导航Activity中OnTouchListener无法生效?求解决方案
解决OnTouchListener失效的问题
嘿,我来帮你排查下这个触摸事件不工作的问题~结合你给出的代码片段,主要从这几个关键点入手:
1. 务必给onTouch方法返回正确的布尔值
这是最容易踩的坑!你的代码片段里onTouch方法没写完返回语句,而这个返回值直接决定触摸事件会不会被你的逻辑消费:
- 返回
true:表示你已经处理了这个触摸事件,不会再把事件传递给其他监听器(比如OnClickListener) - 返回
false:表示你没处理这个事件,系统会继续把事件往下传,你的逻辑可能就不会生效
修正后的示例代码:
@SuppressLint("ClickableViewAccessibility") @Override public void onResume() { super.onResume(); CancelType = (TextView) findViewById(R.id.UCancel); CancelType.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { // 建议根据触摸动作类型区分处理,比如按下、抬起 switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: // 这里写你的Fragment切换逻辑 android.support.v4.app.Fragment fragment = new ProvinceFragment(); if(fragment != null ){ android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); transaction.replace(R.id.your_fragment_container_id, fragment); transaction.commit(); } break; // 如果你需要处理抬起、滑动等动作,可以加对应的case } // 根据需求返回true或false,比如要确保你的逻辑被执行,这里可以返回true return true; } }); }
2. 检查TextView的可交互属性
确保你的UCancel TextView没有被设置为不可触摸:
- 打开对应的XML布局文件,检查有没有
android:clickable="false"或者android:focusable="false",如果有,改成true - 也可以在代码里手动设置:
CancelType.setClickable(true);
3. 防止父控件拦截触摸事件
如果这个TextView在底部导航容器里,有可能父布局(比如BottomNavigationView)拦截了触摸事件。可以试试:
- 给父布局添加
android:descendantFocusability="blocksDescendants"属性,确保子控件能拿到触摸事件 - 或者重写父控件的
onInterceptTouchEvent方法,返回false,允许事件传递给子控件
4. 排查监听器冲突
如果你的TextView同时设置了OnClickListener,触摸事件可能会被OnClickListener抢先处理。这时候可以:
- 要么移除OnClickListener,只用OnTouchListener处理逻辑
- 要么在OnTouchListener里精准区分动作类型,返回合适的布尔值,确保你的逻辑能被执行
内容的提问来源于stack exchange,提问作者Gadura
相关产品推荐
相关产品推荐

