2015-06-10 31 views
4

我正在使用attr創建一個選擇器可繪製爲我的項目,以便一旦我更改主題顏色,我不必在可繪製文件中進行任何更改。我使用下面庫:Android選擇器可繪製不能使用屬性

compile 'com.android.support:appcompat-v7:+' 
compile 'com.android.support:cardview-v7:+' 
compile 'com.android.support:design:22.2.0' 

下面是繪製的源代碼:在相同的代碼

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:drawable="?attr/colorPrimary" android:state_enabled="true" android:state_window_focused="false"/> 
    <item android:drawable="?attr/colorPrimaryDark" android:state_pressed="true"/> 
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/> 
    <item android:drawable="?attr/colorPrimary"/> 
</selector> 

,如果我在colors.xml文件,同樣繪製的作品定義的顏色替換屬性。

樣品繪製顏色:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:drawable="@color/color_primary" android:state_enabled="true" android:state_window_focused="false"/> 
    <item android:drawable="@color/color_primary_dark" android:state_pressed="true"/> 
    <item android:drawable="@android:color/darker_gray" android:state_enabled="false"/> 
    <item android:drawable="@color/color_primary"/> 
</selector> 

提前感謝!

+0

如何繪製可以使用顏色?你必須通過drawable而不是顏色 – Pankaj

+0

android處理該部分本身..請參閱第二個drawable的代碼。有用。問題在於何時使用屬性。 – mudit

+0

我想你必須使用類似[this](http://stackoverflow.com/a/6108156/2715073) – Pankaj

回答

-4

代替「?」將其更改爲「@」

+0

它不適用於@。爲什麼你要我改變?至 @。通常attr是通過引用?而不是@符號。 – mudit

0

我不知道它是否仍然是與你有關的,但我掙扎w ^同樣的事情,我想我已經找到了一個解決方法(有點)。直接使用?attr /不起作用(在api 21及更高版本上工作,但即使這樣,它也不適用於顏色選擇器(僅適用於繪圖工具)。

所以我這樣做(給你我自己的例子) 。 創建attr.xml的屬性附加傷害

<attr name="nav_item_color_selector" format="reference|color"/> 

然後,在你使用的所有的主題,添加屬性,像這樣(FE爲輕主題):

<item name="nav_item_color_selector">@color/text_color_selector_light</item> 

或暗主題(默認):

<item name="nav_item_color_selector">@color/text_color_selector</item> 

現在我text_color_selector.xml(兩者)是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
<item android:state_selected="true" 
     android:color="@color/myAccentColor" /> 
<item android:state_selected="false" 
     android:color = "@color/myTextPrimaryColor"/> 
<item android:color="@color/myTextPrimaryColor" /> 

,當我想使用它們,鐵在着色我的自定義圖像視圖,我用:

<com.yourdomain.yourpackage.NavDrawerIcon 
    android:layout_width="24dp" 
    android:layout_height="24dp" 
    android:layout_gravity="center_vertical" 
    android:src="@mipmap/ic_launcher" 
    android:id="@+id/nav_item_icon" 
    android:layout_margin="24dp" 
    android:tint = "?attr/nav_item_color_selector" 
    android:tintMode="src_atop"/> 

您還可以使用TypedValue以編程方式重新發布它,如下所示:

TypedValue typedValue = new TypedValue(); 
    Resources.Theme theme = context.getTheme(); 
    theme.resolveAttribute(R.attr.nav_item_color_selector, typedValue, true); 
    XmlResourceParser parser = viewGroup.getContext().getResources().getXml(typedValue.resourceId); 
    try { 
     ColorStateList sl = ColorStateList.createFromXml(viewGroup.getContext().getResources(), parser); 
     viewHolder.textView.setTextColor(sl); 

    } catch (Exception e) { } 

我希望這有助於:-)

+0

感謝您的幫助,但這種解決方案對我來說不可行,因爲它需要我爲java代碼中的每個控件設置背景。 – mudit

+0

我明白。我不知道你需要實現什麼,但是如果它是佈局或視圖的背景,那麼它可以使用?attr來引用在xmL中創建的屬性。不一定在java中。即使它在java中,關鍵是你只做一次。因爲一旦你獲得了你使用的每個主題的屬性,它就會讀取參考文件,並以dinamically的方式設置選擇器。 – daxgirl

+0

@daxgirl你有一個使用TypedValue作爲'attr'值的例子嗎?在''Lollipop'前面''StateListDrawable'? –