2010-10-17 35 views
17

Để cung cấp cho người dùng ứng dụng của tôi một chỉ báo hiện trường có tiêu điểm tôi đang cố gắng thay đổi màu nền của một số trường tùy thuộc vào trạng thái hiện tại, tuy nhiên, tôi gặp khó khăn khi hiểu Androids Danh sách nhà nước màu Tài nguyên:Cách chỉ định màu nền trong Tài nguyên danh sách trạng thái màu?

tôi thấy ví dụ (xin lỗi, URL không còn hoạt động) và nếu tôi cố gắng chính xác như nhau, tức là nếu tôi muốn để thích ứng với Format, mọi thứ làm làm việc. Tuy nhiên, nếu tôi thử chỉ điều khác biệt hơi khác, cụ thể là để thích ứng với nền màu, mọi thứ không hoạt động và tôi không hiểu tại sao? Tại sao điều này không phù hợp?

Để đơn giản hơn để hiểu những gì tôi đang cố gắng làm, tôi nối thêm linh tinh của mình. file .xml:

Các AndroidManifest.xml file:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="mmo.android.test" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".Test" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Các Test-Activity:

package mmo.android.test; 

import android.app.Activity; 
import android.os.Bundle; 

public class Test extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
    } 
} 

Các res/values/strings.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="hello">Hello World, Test!</string> 
    <string name="app_name">Test</string> 
</resources> 

res/color/button_test_color.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:color="#f0f"/> <!-- pressed --> 
    <item android:state_focused="true" android:color="#ff0"/> <!-- focused --> 
    <item android:color="#000"/> <!-- default --> 
</selector> 

và cuối cùng res/layout/main.xml tập tin của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 
    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="foobar" 
     android:textColor="@color/button_test_color" 
     android:background="#f00" 
    /> 
    <!-- 
    <Button 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="foobar" 
     android:textColor="#f00" 
     android:background="@color/button_test_color" 
    /> 
    --> 
</LinearLayout> 

Nếu tôi chạy này như thể hiện ở đây, nó hoạt động, tức là tôi nhận được một nút mà văn bản màu thay đổi tùy thuộc vào việc các nút được tập trung, ép vv

Nếu tôi bỏ ghi chú vào nút dưới, nơi tôi chỉ lật các giá trị thuộc tính cho Format và nền tôi nhận được một ngoại lệ, trong đó nêu

... <item> tag requires a 'drawable' attribute or child tag defining a drawable 

Tôi đang thiếu cái quái gì ở đây? Tại sao danh sách trạng thái màu đó được chấp nhận dưới dạng màu văn bản chứ không phải là màu nền? Làm cách nào để xác định màu nền của chế độ xem tùy thuộc vào trạng thái của chế độ xem?

Trả lời

0

Cố gắng xác định Format như có thể vẽ, chứ không phải là một màu sắc:

android:textColor="@drawable/button_test_color" 

loại tài nguyên dựa vào loại tài nguyên mà họ đang có, không phải là tên của thư mục họ đang nằm trong các tập tin XML của. hình thức button_test_color.xml thường được tham chiếu là "drawable" - Tôi thực sự ngạc nhiên "màu" làm việc ở tất cả!

+2

Tạo thêm inf. về việc sử dụng tài nguyên có thể kéo, [câu hỏi này đã được hỏi trước] (http://stackoverflow.com/questions/3506319/android-linearlayout-with-color-resource-what-am-i-doing-wrong). – frayser

+6

Tôi không biết tại sao câu trả lời này được đánh dấu là chính xác. Người hỏi dường như đã theo dõi [tài liệu Android] (http://developer.android.com/guide/topics/resources/color-list-resource.html) cho biết rằng @color sẽ hoạt động tốt với tệp xml trong res/thư mục màu và được gọi bằng tên tập tin. – JulianSymes

+0

Tôi thậm chí còn ngạc nhiên hơn rằng đây là câu trả lời được chọn khi CNTT KHÔNG LÀM VIỆC TẤT CẢ. -1 – Sotti

53

Tôi gặp sự cố chính xác này. Dường như với tôi như android:background không hoạt động với Danh sách trạng thái màu. Tôi nhận được xung quanh điều này bằng cách tạo ra một danh sách nhà nước Drawable thay vào đó (màu sắc cá nhân có thể được sử dụng như drawables trong danh sách nhà nước).

Để sử dụng ví dụ của bạn, tạo ra một tập tin res/drawable/button_test_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_pressed="true" android:drawable="@color/pressed_color"/> 
    <item android:state_focused="true" android:drawable="@color/focused_color"/> 
    <item android:drawable="@color/default_color"/> 
</selector> 

Lưu ý việc sử dụng android:drawable thay vì android:color. Android sẽ sử dụng tài nguyên màu và tạo một bản vẽ có thể rút ra được. Để hoàn tất việc này ra, bạn cần phải thêm các nguồn tài nguyên màu sắc để tập res/values/colors.xml của bạn:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    ... 
    <color name="pressed_color">#f0f</color> 
    <color name="focused_color">#ff0</color> 
    <color name="default_color">#000</color> 
    ... 
</resources> 

Sau đó bạn sẽ tham khảo drawable này sử dụng @drawable/button_test_background thay vì @color/button_test_color.

Vì vậy, tóm lại, Danh sách trạng thái màu hoạt động tốt cho android:textColor, nhưng đối với android:background, thì phương pháp có thể vẽ Danh sách trạng thái ở trên là cần thiết.

+0

+1 - công trình này hoàn hảo. :) –

+5

Đây phải là câu trả lời được chấp nhận. – Sotti

+0

Khẩn cấp. Cảm ơn bạn đã xác nhận sự nghi ngờ của tôi – Mark

Các vấn đề liên quan