在寫布局文件的時候,有的View會放在其它View的上層,通常情況下顯示底層View可以讓上層的View隱藏,有沒有方法不讓上層View隱藏而讓底層View顯示呢?
這里有一個方法可以做到bringToFront,這里看下效果,在布局文件中寫了兩個TextView,其中一個遮擋住下面的TextView
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/low_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:gravity="center"
android:text="我是底層TextView" />
<TextView
android:id="@+id/upper_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:background="#000000"
android:gravity="center"
android:text="我是上層TextView"
android:textColor="#ffffff" />
</RelativeLayout>
為上層TextView設(shè)置點擊事件,點擊時調(diào)用底層TextView的bringToFront方法
....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.upper_tv).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
findViewById(R.id.low_tv).bringToFront();
}
});
}
....
效果如下:

點擊后效果
大體效果就是在不隱藏上層TextView的情況下,我們點擊上層TextView,調(diào)用bringToFront方法,底層TextView顯示在上層了。
我們大體來分析下源碼中這個方法是如何做到的了:
首先看下View中這個方法:
View中
public void bringToFront() {
if (mParent != null) {
mParent.bringChildToFront(this);
}
}
很簡單的兩句,這里mParent就是View的容器View,也就是ViewGroup之類的View。
接著我們跟進去,可以看到ViewParent中聲明了這個方法
ViewParent中
public void bringChildToFront(View child);
我們找一個子類的實現(xiàn)看下
ViewGroup中
@Override
public void bringChildToFront(View child) {
final int index = indexOfChild(child);
if (index >= 0) {
removeFromArray(index);
addInArray(child, mChildrenCount);
child.mParent = this;
requestLayout();
invalidate();
}
}
到這里我們就明白了,首先找到子View的位置,從ViewTree中移除子View,再將子View添加到上層,重新繪制ViewGroup顯示。是不是很簡單了O(∩_∩)O哈哈~