`
吃货吃货
  • 浏览: 33025 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

解决组件与父组件监听冲突问题

阅读更多

解决组件与父组件监听冲突问题

相信大家在做android开发的时候,都会有遇到组件与父组件的监听相互冲突的时候。

举个具体的例子:在游戏详情Activity中使用了一个横向的ListView为了显示图片,但是为了翻阅方便,我们通常会在这个Activity中使用一个ScrollView显示,这样的话,就不用担心文本中信息过长而导致的界面无法显示,虽然这样能够让我们的界面更加美观,但也增加了一个难题,就是在ListView中拖拽时,父组件(也就是ScrollView)也会监听到这样的一个事件,于是当你想拖动ListView时,有可能会没有反应,但是ScrollView却有可能做出相应的反应。其实解决这个问题的关键代码非常简单,只需要一句requestDisallowInterceptTounchEvent();

下面是效果图:

当ListView拖动时:

 

当ScrollView拖动时:



     以下便直接上代码:

主界面代码:

Xml代码 
  1. <span style=""><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     tools:context=".MainActivity" >  
  6.   
  7.     <ScrollView  
  8.         android:id="@+id/scrollView"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent" >  
  11.   
  12.         <LinearLayout  
  13.             android:layout_width="match_parent"  
  14.             android:layout_height="wrap_content"  
  15.               
  16.             android:orientation="vertical" >  
  17.               
  18.             <com.example.controls.HorizontalListView  
  19.                 android:id="@+id/HorizontalListView"         
  20.                 android:layout_height="270dp"                 
  21.                 android:layout_width="wrap_content"  
  22.                 android:layout_marginBottom="10dp"  
  23.                 android:layout_marginLeft="10dp"  
  24.                 android:layout_marginRight="10dp"  
  25.                 android:layout_marginTop="10dp" />  
  26.   
  27.             <LinearLayout  
  28.                 android:layout_width="match_parent"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:orientation="vertical"  
  31.                  >  
  32.   
  33.                 <TextView  
  34.                     android:id="@+id/textView2"  
  35.                     android:layout_width="wrap_content"  
  36.                     android:layout_height="wrap_content"  
  37.                     android:layout_marginBottom="10dp"  
  38.                     android:layout_marginLeft="10dp"  
  39.                     android:layout_marginTop="10dp"  
  40.                     android:text="游戏名称:窦豆豆"  
  41.                     android:textSize="24sp" />  
  42.   
  43.                 <TextView  
  44.                     android:id="@+id/textView1"  
  45.                     android:layout_width="wrap_content"  
  46.                     android:layout_height="wrap_content"  
  47.                     android:layout_marginBottom="10dp"  
  48.                     android:layout_marginLeft="10dp"  
  49.                     android:layout_marginTop="10dp"  
  50.                     android:text="游戏大小:24M"  
  51.                     android:textSize="24sp" />  
  52.   
  53.                 <TextView  
  54.                     android:id="@+id/textView3"  
  55.                     android:layout_width="wrap_content"  
  56.                     android:layout_height="wrap_content"  
  57.                     android:layout_marginBottom="10dp"  
  58.                     android:layout_marginLeft="10dp"  
  59.                     android:layout_marginTop="10dp"  
  60.                     android:text="下载次数:500W次"  
  61.                     android:textSize="24sp" />  
  62.   
  63.                 <TextView  
  64.                     android:id="@+id/textView4"  
  65.                     android:layout_width="wrap_content"  
  66.                     android:layout_height="wrap_content"  
  67.                     android:text="游戏简介"  
  68.                     android:layout_marginBottom="10dp"  
  69.                     android:layout_marginLeft="10dp"  
  70.                     android:layout_marginTop="10dp"  
  71.                     android:textSize="24sp" />  
  72.   
  73.                 <TextView  
  74.                     android:id="@+id/textView5"  
  75.                     android:layout_width="wrap_content"  
  76.                     android:layout_height="wrap_content"  
  77.                     android:text="这是一个游戏简介\n这是一个游戏简介\n这是一个游戏简介\n这是一个游戏简介\n"  
  78.                      android:layout_marginBottom="10dp"  
  79.                     android:layout_marginLeft="10dp"  
  80.                     android:layout_marginTop="10dp"  
  81.                     android:textSize="24sp" />  
  82.                   
  83.             </LinearLayout>  
  84.               
  85.         </LinearLayout>  
  86.     </ScrollView>  
  87.   
  88. </LinearLayout>  
  89. </span>  

 这是ListView每个Item的代码

Xml代码 
  1. <span style=""><?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <LinearLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:orientation="vertical" >  
  11.   
  12.         <ImageView  
  13.             android:id="@+id/imageView1"  
  14.             android:layout_width="wrap_content"  
  15.             android:layout_height="wrap_content"  
  16.             android:layout_gravity="center"  
  17.             android:layout_margin="10dp"  
  18.             android:src="@drawable/ic_launcher" />  
  19.   
  20.     </LinearLayout>  
  21.   
  22. </LinearLayout>  
  23. </span>  

     主界面java代码:

Java代码 
  1. <span style="">package com.example.listviewdemo;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import android.app.Activity;  
  7. import android.os.Bundle;  
  8. import android.view.LayoutInflater;  
  9. import android.view.Menu;  
  10. import android.view.MotionEvent;  
  11. import android.view.View;  
  12. import android.view.View.OnTouchListener;  
  13. import android.view.ViewGroup;  
  14. import android.widget.BaseAdapter;  
  15. import android.widget.ImageView;  
  16. import android.widget.ScrollView;  
  17.   
  18. import com.example.controls.HorizontalListView;  
  19.   
  20. public class MainActivity extends Activity {  
  21.       
  22.     private ScrollView scrollView;  
  23.     private HorizontalListView horizontalListView;  
  24.     private List<Integer> list = new ArrayList<Integer>();  
  25.       
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.           
  31.         scrollView = (ScrollView) findViewById(R.id.scrollView);  
  32.         horizontalListView = (HorizontalListView) findViewById(R.id.HorizontalListView);  
  33.         horizontalListView.setOnTouchListener(new OnTouchListener() {             
  34.             @Override  
  35.             public boolean onTouch(View arg0, MotionEvent event) {  
  36.                 // TODO Auto-generated method stub  
  37.                 if (event.getAction() == MotionEvent.ACTION_UP) {  
  38.                     scrollView.requestDisallowInterceptTouchEvent(false);  
  39.                 } else {  
  40.                     scrollView.requestDisallowInterceptTouchEvent(true);  
  41.                 }  
  42.                 return false;  
  43.             }  
  44.         });  
  45.         setImageView(horizontalListView);  
  46.     }  
  47.   
  48.     @Override  
  49.     public boolean onCreateOptionsMenu(Menu menu) {  
  50.         // Inflate the menu; this adds items to the action bar if it is present.  
  51.         getMenuInflater().inflate(R.menu.main, menu);  
  52.         return true;  
  53.     }  
  54.       
  55.     private void setImageView(HorizontalListView horizontalListView){  
  56.         list.add(R.drawable.pic_game);  
  57.         list.add(R.drawable.pic_game);  
  58.         list.add(R.drawable.pic_game);  
  59.         horizontalListView.setAdapter(new MyAdapter(list, getLayoutInflater()));  
  60.     }  
  61.       
  62.     protected class MyAdapter extends BaseAdapter{  
  63.           
  64.         private List<Integer> list;  
  65.         private LayoutInflater layoutInflater;  
  66.           
  67.         public MyAdapter(List<Integer> list,LayoutInflater layoutInflater){  
  68.             this.list = list;  
  69.             this.layoutInflater = layoutInflater;  
  70.         }  
  71.           
  72.         @Override  
  73.         public int getCount() {  
  74.             // TODO Auto-generated method stub  
  75.             return list.size();  
  76.         }  
  77.   
  78.         @Override  
  79.         public Object getItem(int arg0) {  
  80.             // TODO Auto-generated method stub  
  81.             return list.get(arg0);  
  82.         }  
  83.   
  84.         @Override  
  85.         public long getItemId(int arg0) {  
  86.             // TODO Auto-generated method stub  
  87.             return arg0;  
  88.         }  
  89.   
  90.         @Override  
  91.         public View getView(int arg0, View arg1, ViewGroup arg2) {  
  92.             // TODO Auto-generated method stub  
  93.             int image = list.get(arg0);  
  94.             View view = layoutInflater.inflate(R.layout.item, null);  
  95.             ImageView iv = (ImageView) view.findViewById(R.id.imageView1);  
  96.             iv.setImageResource(image);  
  97.             return view;  
  98.         }  
  99.           
  100.     }  
  101.   
  102. }  
  103. </span>  
  • 大小: 238.5 KB
  • 大小: 212.5 KB
0
1
分享到:
评论

相关推荐

    两个重叠组件触摸事件冲突解决

    在Android开发中,UI设计时常会遇到两个或多个组件重叠的情况,这可能导致触摸事件的冲突问题。本文将深入探讨Android中的OnTouch事件分发机制,并提供解决方案来处理这种冲突。 首先,我们要理解Android的事件分发...

    android侧滑菜单实现,及策划菜单与viewpager监听冲突问题的解决方法

    本篇将详细讲解如何实现一个带有侧滑菜单的Android应用,并解决与ViewPager滑动冲突的问题。 首先,我们来了解一下如何实现侧滑菜单。Android中有多种实现方式,如使用第三方库如SlidingMenu或DrawerLayout。...

    Oracle监听问题及解决

    - **冲突与兼容性**:检查是否有其他进程占用相同端口,或者数据库版本与监听程序版本之间存在兼容性问题。 通过以上步骤,大多数Oracle监听问题都能得到解决。如果问题依然存在,建议查看Oracle数据库的日志文件以...

    全网唯一有用的解决方案!彻底解决VerticalViewPager嵌套RecyclerView引起的滑动冲突!

    总之,解决VerticalViewPager与RecyclerView的滑动冲突是一个涉及事件分发、手势检测和视图层次管理的复杂问题。通过自定义事件处理、使用帮助类或第三方库,开发者可以有效地避免这种冲突,提高用户体验。在实际...

    解决vue单页面多个组件嵌套监听浏览器窗口变化问题

    父组件监听窗口变化,然后通过事件总线广播这个事件,子组件监听这个事件并作出响应。这样,即使子组件生命周期早于父组件,也能正确接收并处理窗口变化。 ```javascript // 创建一个全局的EventBus const EventBus...

    vue 子组件和父组件传值的示例

    本篇文章将深入探讨Vue子组件与父组件之间的数据传递,帮助开发者更好地理解和运用这一核心特性。 ### 一、子组件向父组件传值 #### 1. 子组件中 在子组件中,我们通常使用`$emit`事件触发器来向父组件发送事件,...

    HorizontalScrollView 与 viewpager冲突的解决

    总的来说,解决 `HorizontalScrollView` 与 `ViewPager` 冲突的关键在于正确处理滑动事件和优化组件性能。理解这些组件的工作原理并针对性地调整布局和代码,能帮助我们构建出更加稳定、高效的Android应用。

    自定义view冲突解决

    如果自定义View与父View或兄弟View有相同的事件监听器,可能会发生事件处理混乱。使用`requestDisallowInterceptTouchEvent()`来控制事件分发,或者明确指定事件处理的优先级。 ### 5. 版本兼容性问题 不同Android...

    基于vue的颜色选择器组件

    在实际开发中,你可能会遇到的问题包括但不限于颜色解析错误、组件样式冲突、交互体验不佳等。解决这些问题通常需要对Vue.js和颜色处理有深入的理解。通过学习和使用"基于vue的颜色选择器组件",开发者可以提升在Vue...

    完美解决ListView和CheckBox的焦点冲突及CheckBox的复用问题

    本文将详细探讨这些问题以及如何通过优化来实现“完美解决ListView和CheckBox的焦点冲突及CheckBox的复用问题”。 一、焦点冲突问题 在ListView中,通常一个列表项被点击时,焦点会自动转移到该列表项,但如果列表...

    SlidingMenu+ViewPage+ViewPage嵌套(类似网易 ) 滑动时冲突问题解决

    总的来说,处理SlidingMenu与ViewPager的滑动冲突是一项挑战,但通过理解Android触摸事件的处理机制,以及合理利用现有的库和组件,我们可以有效地解决这些问题,实现流畅的用户体验。在实际开发中,不断学习和实践...

    微信小程序组件化解决方案.zip

    3. **数据绑定与事件处理**:组件间的数据传递通常通过props实现,父组件可以向子组件传递数据,子组件则通过props接收到的数据进行渲染。事件处理则通过在组件上添加事件监听器,然后在组件的`js`文件中定义相应的...

    SlidingMenu和Listview冲突解决方案

    总之,解决SlidingMenu与ListView冲突的关键在于正确处理触摸事件和滑动手势,确保每个组件在正确的时间响应用户的操作。通过理解Android的事件处理机制和组件交互方式,开发者可以有效地解决这类问题,提高应用的...

    ListViewPager_完美解决ListView和ViewPager的滑动冲突

    然而,在某些场景下,当这两个组件同时存在且布局相邻时,可能会出现滑动冲突的问题,导致用户体验下降。本篇文章将深入探讨这个问题,并提供一个名为"ListViewPager"的解决方案。 滑动冲突的产生原因主要是由于...

    uni-app的map层级问题封装.zip

    然而,在实际开发过程中,开发者可能会遇到地图层级问题,即地图与其他组件重叠或者交互不顺畅的问题。"uni-app的map层级问题封装.zip"这个压缩包文件很可能是为了解决这一问题而提供的一个解决方案。 首先,uni-...

    Android滑动冲突解决

    例如,如果只需要简单的滑动行为,可能直接使用NestedScrollView和RecyclerView就能解决问题;而对于需要复杂交互的情况,可能需要重写触摸事件处理方法来实现自定义滑动规则。 总的来说,解决Android滑动冲突需要...

    在线将SVG转换为Vue组件

    - **命名规范**:确保SVG组件的命名遵循Vue的命名规则,避免与内置关键字冲突。 - **浏览器兼容性**:虽然SVG本身具有良好的跨浏览器支持,但需要检查转换后的Vue组件在目标浏览器中的表现。 - **代码压缩**:在...

    基于vue2的省市区三级联动组件

    确保组件的样式隔离,防止样式冲突。 在`vue-address-picker-master`这个压缩包中,可能包含了这个组件的源代码,包括`AddressPicker.vue`组件文件,以及相关的测试、配置和示例文件。你可以通过阅读这些源码来深入...

    8.(vue3.x+vite)组件间通信方式之window挂实例.rar

    例如,一个表单组件完成提交后,可以通过`$emit`触发`onSubmit`事件,父组件监听这个事件并处理提交逻辑。 3. **Vuex**: 当项目变得复杂,多个组件需要共享状态时,使用Vuex作为全局状态管理器非常有用。Vuex是一个...

    解决SlidingMenu和ViewPager滑动冲突

    在Android应用开发中,SlidingMenu与ViewPager是两种常见的组件,它们各自有着独特的作用。SlidingMenu通常用于实现侧滑菜单效果,而ViewPager则用于展示多个页面并支持左右滑动切换。然而,在某些场景下,当这两种...

Global site tag (gtag.js) - Google Analytics