zoukankan      html  css  js  c++  java
  • 设置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

  • 相关阅读:
    .NET MVC后台发送post请求
    (整理)Sublime Text 3 安装、破解、安装Package Control、汉化、添加到右键菜单、代码格式化、禁止更新
    百度api查询多个地址的经纬度的问题
    try{}里有一个 return 语句,那么紧跟在这个 try 后的 finally {}里的 code 会 不会被执行,什么时候被执行,在 return 前还是后?
    js获取某个日期所在周周一的日期
    重学C++ (1)
    基于.NET平台常用的框架整理
    指针常量和常量指针的区别
    C++四种强制类型转换关键字
    const define 定义常量的区别
  • 原文地址:https://www.cnblogs.com/dongweiq/p/6051381.html
Copyright © 2011-2022 走看看