如何在我的风格中获得自己定义的属性值

时间:2011-11-25 15:41:50

标签: android coding-style resources themes

我想使用自定义(自己的)属性为对话框创建3个不同的主题。 我想通过将其添加到主题的样式来设置标题颜色: <item name="titleColor">#FF0000</item>

my themes.xml:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="@android:style/Theme">
    <item name="android:alertDialogStyle">@style/dialog</item>
</style>
<style name="MyRedTheme" parent="MyTheme">
    <item name="titleColor">#FF0000</item>
</style>
<style name="MyGreenTheme" parent="MyTheme">
    <item name="titleColor">#00FF00</item>
</style>
<style name="MyBlueTheme" parent="MyTheme">
    <item name="titleColor">#0000FF</item>
</style>

我在attrs.xml中定义了titleColor属性:

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <declare-styleable name="MyCustomAttributes">
  <attr name="titleColor" format="color|reference" />
 </declare-styleable>
</resources>

我为对话框应用了一个主题。 如何将titleColor属性的值传递给“android:color”属性?

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:custom="http://schemas.android.com/apk/res/com.dicare"
   android:shape="rectangle">
       <solid android:color="I want to pass titleColor value here"/>
</shape>

3 个答案:

答案 0 :(得分:11)

?titleColor see here

您可以在colors.xml文件中定义颜色,并像普通资源一样引用它们:@ color / MyRed

您可以为自己的视图创建自定义属性,您可以从布局xmls中对其进行自定义。例如,您可以扩展TextView以一种颜色(titleColor)编写第一行文本而不是文本的其余部分(android:textColor)。

<color name="MyRed">#FF0000</color>

<style name="MyRedTheme" parent="MyTheme">
    <item name="titleColor">@color/MyRed</item>
</style>

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:custom="http://schemas.android.com/apk/res/com.dicare"
   android:shape="rectangle">
       <solid android:color="@color/MyRed"/>
</shape>

答案 1 :(得分:1)

所以你要做的第一件事就是编辑你的attrs.xml文件。在这里,您将添加要通过xml定义的所有属性。这里我们添加了一个标题,以及带有文本和drawable的左右按钮。

<declare-styleable name="activity_header">
    <attr name="title" format="string" />               

    <attr name="left_button_text" format="string" />
    <attr name="left_button_drawable" format="reference" />

    <attr name="right_button_text" format="string" />
    <attr name="right_button_drawable" format="reference" />

    <attr name ="hide_buttons">
        <enum name="yes" value="1" />
        <enum name="no" value="0" />
    </attr>                        
</declare-styleable> 

接下来,您将要创建布局。这里重要的是添加一个引用您的应用程序的命名空间。在这里,我将它命名为app。您只需在http://schemas.android.com/apk/res/之后添加您的包名称即可。现在,您可以在xml文件中使用上面定义的任何属性。

&LT;

LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app = "http://schemas.android.com/apk/res/com.biggu.shopsavvy.ui4"  
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:orientation="vertical" 
      >


<com.biggu.shopsavvy.ui4.ActivityHeader 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"                   
    android:id="@+id/header"
    app:title = "History"                                  

    app:left_button_text="Share"
    app:left_button_drawable="@drawable/ic_menu_share" 

    app:right_button_drawable="@drawable/small_btn_archive"
    app:right_button_text="Organize"   />

现在我们已经在xml文件中定义了属性,我们需要从我们自定义的组件中检索它们。您只需使用您创建的资源获取获取的样式属性,此处我们使用activity_header。

  public class ActivityHeader extends LinearLayout {

    TextView mTitleEditText;
    Button mLeftButton;
    Button mRightButton;

    View mDelimeter;
    private ViewGroup mAdditionalPanel;



    public ActivityHeader(Context context, AttributeSet attrs) {
        super(context, attrs);      
        ViewGroup.inflate(context, R.layout.header , this);             

        findViews();

        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.activity_header);      

        if ( a.getInt(R.styleable.activity_header_hide_buttons, 0) == 1) //hide buttons
        {
            mLeftButton.setVisibility(GONE);
            mRightButton.setVisibility(GONE);
        }
        else
        {
            setLeftButtonDrawable(a.getResourceId(R.styleable.activity_header_left_button_drawable, android.R.drawable.ic_menu_info_details));      
            setLeftButtonText(a.getString(R.styleable.activity_header_left_button_text));                       

            setRightButtonDrawable(a.getResourceId(R.styleable.activity_header_right_button_drawable, android.R.drawable.ic_menu_info_details));                    
            setRightButtonText(a.getString(R.styleable.activity_header_right_button_text)); 
        }


        setTitle(a.getString(R.styleable.activity_header_title));                                                                                         
        a.recycle();        
    }
}

就是这样。快乐的编码。

答案 2 :(得分:0)

我认为您需要做的就是更改自定义的android:color:color:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:custom="http://schemas.android.com/apk/res/com.dicare"
   android:shape="rectangle">
       <solid custom:color="I want to pass titleColor value here"/>
</shape>