設置background屬性使用selector的時候內置?attr報錯的解決方案


當我們設置background屬性的時候可以設置background="@color/black"

也可以設置 background="@drawable/selector"

然后selector我們可以這樣設置

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 沒有焦點時的背景圖片 -->
    <item android:drawable="@color/colorPressed" android:state_pressed="true"/>
    <item android:drawable="@color/colorPressed" android:state_focused="true"/>
    <item android:drawable="@color/colorPressed" android:state_selected="true"/>
    <item android:drawable="@color/black" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
</selector>
但是當我們設置了屬性來設置這個顏色的時候就會遇到崩潰
比如我們這樣
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 沒有焦點時的背景圖片 -->
    <item android:drawable="@color/colorPressed" android:state_pressed="true"/>
    <item android:drawable="@color/colorPressed" android:state_focused="true"/>
    <item android:drawable="@color/colorPressed" android:state_selected="true"/>
    <item android:drawable="?attr/backgroundColorValue" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
</selector>
運行的話會直接崩潰,報錯的原因是無法獲取到對應的drawable對象,至於為什么無法將顏色轉換成對應的drawable我也不清楚,既然不能轉換那我們可以手動轉換
解決方案:
手動創建一個shape.xml,如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <solid android:color="?attr/backgroundColorValue" />
</shape>
然后我們再到selector中引用這個drawable就可以了
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 沒有焦點時的背景圖片 -->
    <item android:drawable="@color/colorPressed" android:state_pressed="true"/>
    <item android:drawable="@color/colorPressed" android:state_focused="true"/>
    <item android:drawable="@color/colorPressed" android:state_selected="true"/>
    <item android:drawable="@drawable/shape" android:state_focused="false" android:state_pressed="false" android:state_selected="false"/>
</selector>

 

2016-11-11補充 :
這種方式在android6.0以上設備可用,但在android5.0及以下設備仍然會崩潰
這個時候將 shape中的
<solid android:color="?attr/backgroundColorValue" />
修改為
<solid android:background="?attr/backgroundColorValue" />
就不會崩潰,但在android6.0設備上背景顏色就變成了透明,而在5.0以下設備就沒有問題
因此這不是一個好的解決方案,很多設備沒有升級到6.0
參考 http://blog.csdn.net/qingfeng812/article/details/51601500 

經過一番查找,目前已經了解到根本的原因,出現這個問題,主要是因為android在api23版本才支持selector從主題中讀取顏色值
低於api23只能使用代碼去支持,所以我們需要用代碼去創建這個selector,然后才可以實現對應的切換
參考 http://blog.csdn.net/qq284565035/article/details/52177225

至於如何用代碼創建selector,參見如下代碼:

 

StateListDrawable drawable = new StateListDrawable();
        //Non focused states
        drawable.addState(new int[]{-android.R.attr.state_focused, -android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact));
        drawable.addState(new int[]{-android.R.attr.state_focused, android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        //Focused states
        drawable.addState(new int[]{android.R.attr.state_focused,-android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        drawable.addState(new int[]{android.R.attr.state_focused,android.R.attr.state_selected, -android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        //Pressed
        drawable.addState(new int[]{android.R.attr.state_selected, android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
        drawable.addState(new int[]{android.R.attr.state_pressed},
                getResources().getDrawable(R.drawable.contact_sel));
         
        TextView textView = (TextView) findViewById(R.id.TextView_title);
                
        textView.setCompoundDrawablesWithIntrinsicBounds(null, drawable, null, null);

 

參考 https://my.oschina.net/non6/blog/298156

 

http://www.cnblogs.com/jason-star/archive/2012/09/28/2706698.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM