天天看點

Android中為ViewGroup設定selector無效果

今天做項目的時候, 上司想要一個類似于QQ中的設定的界面, 就是那種使用圓角邊框做背景的顯示效果。 如下:

Android中為ViewGroup設定selector無效果

每個條目點選之後會顯示不同的顔色, 如下:

Android中為ViewGroup設定selector無效果

這種效果其實實作起來很簡單, 圓角邊框使用shape圖形做背景。 條目點下去顯示不同顔色的效果使用背景選擇器selector。 shape和selector都是android中的圖像元素。 我使用shape圖形設定了圓角, 并做為背景, 設計出了如下的簡單界面:

Android中為ViewGroup設定selector無效果

上圖中上下兩部分和中間的分割線都放在一個垂直方向的線性布局中, 這個線性布局使用一個圓角的shape做背景。 上下兩個條目都是一個RelativeLayout 。 

下一步就是為每個條目設定背景選擇器selector , 以使點選條目時顯示藍色做為背景。 我為上圖中的第一個條目寫的背景選擇器round_corner_top_item_bg.xml如下:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_pressed="true" android:state_focused="false">
        <shape>
            <corners android:topLeftRadius="5dp"
                android:topRightRadius="5dp"/>

            <solid android:color="#257AC1" />

            <stroke android:width="0dp"/>
        </shape>
        
    </item>
    
    <item >
        <shape>
            <corners android:topLeftRadius="5dp"
                android:topRightRadius="5dp"/>

            <solid android:color="#FFFFFF" />

            <stroke android:width="0dp"/>
        </shape>
    </item>

</selector>
           

然後為第一個條目設定背景:

android:background="@drawable/round_corner_top_item_bg"
           

本來以為超級簡單, 但是在測試程式時, 這個selector無論如何也沒有任何效果!!!将這個selector檔案檢查了很多遍, 沒發現什麼錯誤。 這讓我很抓狂啊。 然後想到是不是因為是為ViewGroup設定的selector而不是為單一的控件設定的selector。 是以, 我在布局中加入了一個Button, 然後把這個selector設定到Button上, 它是有效果的。 難道ViewGroup不能使用selector嗎?  在網上搜了半天, 也沒有找到答案。

是以決定先寫代碼邏輯, 在代碼中為這個條目設定點選監聽:

titleLayout.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Log.i("xxx", "click title");
			}
		}) ;
           

這時候奇怪的事情發生了! selector竟然有效果了! 

Android中為ViewGroup設定selector無效果

真是讓人無語啊。 搞了半天, 也不知道什麼原因。 

是以。 如果為一個ViewGroup設定了Selector, 但是沒有效果, 那麼在代碼中為這個ViewGroup先設定OnClick事件, 可能就會解決這個問題!

到此為止, 我也沒想出來原因。 估計和Android元件的事件傳遞機制相關。 有知道原因的讀者還希望不吝賜教。