您的位置:首页 > 其它

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布局的时候注意点就是了,以免出现了问题还莫名其妙的找不到原因。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息