RelativeLayout布局的一点坑
2016-12-31 12:28
281 查看
问题背景:
前几天自己负责的模块出现了一个crash的问题,crash啊,很严重有木有!拿到Log后分析,NullPointException,好吧,根据行数定位出出现问题所在的代码。然后发现了毕现的场景:进入一个页面,页面内有一个ProgressBar(match_parent)去请求网络,考验手速的时候到了,哈哈哈,在数据还没请求完成的时候,也就是ProgressBar还没消失的时候,快速的点击页面底部的按钮区域(ProgressBar覆盖在该按钮布局上面),出现了Crash!!!,就是上面的空指针异常,问题原因很简单:就是数据没请求下来,还没对某一个实体赋值就调用了该实体的一个方法,导致了空指针异常。问题分析:
好吧,找到该问题必现条件后就开始分析,按理说按钮被ProgressBar覆盖在下面,应该响应不了点击事件的啊,但事实确实是按钮响应的点击事件导致的空指针异常。分析到这,可以肯定的是布局出现了问题,为了调试的方便,就将该块布局单独拎出来写Demo验证。很简单的一个布局,activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.hdfy.testapp.MainActivity"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <Button android:layout_width="match_parent" android:layout_height="50dp" android:onClick="buttonClickOne" android:text="buttonClick One" /> </RelativeLayout> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#F15A24"> </RelativeLayout> </RelativeLayout>
主Activity:MainActivity.java
package com.example.hdfy.testapp; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Toast; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getSupportActionBar().setTitle("MainActivity"); } public void buttonClickOne(View view){ Toast.makeText(this,"buttonClickOne...",Toast.LENGTH_LONG).show(); } }
点击页面上方的区域,然后
ps:暂未找到录制gif的软件,求推荐^_^
是的,你没看错,底下一层的RelativeLayout中的Button响应了点击事件,经过了多次调整布局
验证后,得出了结论:只要页面根布局是RelativeLayout,就会导致里面覆盖的布局会出现这种问题
。而LinearLayout不会出现这样的问题,因为第二个布局根本就不会显示(第一个布局设置了match_parent)
最后在网上找了下资料:
android relativelayout 上下布局重叠为什么下层的控件会响应
https://zhidao.baidu.com/question/303928214356302284.html
Android TouchEvent事件传递机制
http://blog.csdn.net/morgan_xww/article/details/9372285
是的,又扯上了View的事件传递机制,关于这方面的知识,大家可以去看下上面的这篇博客
《Android TouchEvent事件传递机制 》
总之,大家后面在使用relativelayout布局的时候注意点就是了,以免出现了问题还莫名其妙的找不到原因。
相关文章推荐
- Android之RelativeLayout(相对布局)
- 自定义RelativeLayout view实现布局。
- android xml布局文件中使用RelativeLayout,明明有这个id,却提示找不到---->解决办法
- Android RelativeLayout相对布局
- relativelayout实现梅花布局
- Android相对布局RelativeLayout常用到的属性
- StudyJams-第02课_线性布局(LinearLayout)、相对布局(RelativeLayout)、填充(padding)、边距(margin)
- Android布局控件之RelativeLayout详解
- RelativeLayout代码实现相对布局
- android RelativeLayout布局注意
- 相对布局(RelativeLayout)
- 从头学Android之RelativeLayout相对布局
- android 布局relativeLayout实现底部标签
- Android相对布局RelativeLayout各属性介绍
- Android课堂笔记——LinearLayout和RelativeLayout常用的两种布局方式
- RelativeLayout相对布局
- 关于相对布局RelativeLayout的各种属性介绍
- Android RelativeLayout布局位置属性
- 如何优化你的布局层级结构之RelativeLayout和LinearLayout及FrameLayout性能分析
- Android学习(一)RelativeLayout布局属性