问题背景:
前几天自己负责的模块出现了一个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布局的时候注意点就是了,以免出现了问题还莫名其妙的找不到原因。
欢迎关注我的个人微信公众号: