Как получить собственное значение атрибута в моем стиле - PullRequest
17 голосов
/ 25 ноября 2011

Я хочу создать 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>

Я определил атрибут titleColor в attrs.xml:

<?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 ]

11 голосов
/ 02 декабря 2011

? TitleColor см. Здесь

или

Вы определяете свои цвета в файле 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 голос
/ 03 декабря 2011

Итак, первое, что вам нужно сделать, это отредактировать файл attrs.xml.Здесь вы добавите все атрибуты, которые вы хотите определить через xml.Здесь мы добавили заголовок, а также правую и левую кнопки с текстом и рисованием.

<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> 

Далее вы захотите создать свой макет.Здесь важно добавить пространство имен, которое относится к вашему приложению.Здесь я назвал это приложение.Вам просто нужно указать название вашего пакета после http://schemas.android.com/apk/res/.Теперь вы можете использовать любые атрибуты, которые вы определили выше в вашем XML-файле.

<</p>

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();        
    }
}

Вот и все.Удачного кодирования.

0 голосов
/ 29 ноября 2011

Я думаю, что все, что вам нужно сделать, это изменить 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 custom:color="I want to pass titleColor value here"/>
</shape>
...