TextView处理长按事件、父布局处理其点击事件的技术咨询
这其实是Android事件分发机制的典型场景,咱们一步步来实现你想要的效果:
实现方案
核心思路就是利用Android的事件传递规则:子View如果不处理某个触摸事件,事件就会向上“冒泡”给父View;要是子View把事件“吃了”(比如长按返回true),那传递就会终止。
1. 搞定TextView的长按事件
你写的长按监听代码已经很对了,关键就是onLongClick方法要返回true——这相当于告诉系统“这个长按事件我已经处理完了,不用再往上传了”。完整代码如下:
textview.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { Toast.makeText(getContext(), "longclick", Toast.LENGTH_SHORT).show(); return true; // 消费长按事件,不让父布局收到 } });
2. 让父布局接管TextView的点击事件
这里有个关键点:别给TextView设置OnClickListener。因为如果TextView自己没处理点击事件,系统就会把这个点击事件自动传递给它的父布局,也就是你的RelativeLayout,这样父布局的点击监听就会触发。
然后把你没写完的父布局点击监听补全:
layout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getContext(), "layout onclick", Toast.LENGTH_SHORT).show(); } });
3. 几个要注意的小细节
- 不用手动给RelativeLayout设置
android:clickable="true":当你给它设置点击监听的时候,系统会自动把这个属性设为true。 - 检查TextView的属性:如果TextView加了
android:clickable="true",记得删掉,不然它会自己把点击事件吃掉,父布局就收不到了。
这样设置完之后,就能完美实现你的需求:
- 长按TextView:弹出「longclick」提示,父布局没反应
- 点击TextView或者父布局的空白区域:都会弹出「layout onclick」提示
内容的提问来源于stack exchange,提问作者user9709179
相关产品推荐
相关产品推荐

