Android установить пользовательские атрибуты в styles.xml и получить в программе - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь получить настраиваемый атрибут кнопки для возврата true / false, используя настраиваемые атрибуты, определенные в styles.xml.Мой пример тривиален только с двумя кнопками, но я не могу заставить его работать.Мой макет выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".CustomAttr">

    <Button
        android:id="@+id/button_1"
        style="@style/red_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1!" />

    <Button
        android:id="@+id/button_2"
        style="@style/blue_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2!" />

</LinearLayout>
<resources>

styles.xml выглядит следующим образом:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <attr name="is_red" format="boolean"/>
    <style name="red_button" >
        <item name="android:background">#ffff0000</item>
        <item name="is_red">true</item>
    </style>
    <style name="blue_button" >
        <item name="android:background">#ff0000ff</item>
        <item name="is_red">false</item>
    </style>

</resources>

И код выглядит так:

public class CustomAttr
        extends AppCompatActivity
        implements View.OnClickListener {
    private static final String TAG = 
         CustomAttr.class.getSimpleName();  
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.custom_attr);
        findViewById(R.id.button_1)
            .setOnClickListener(this);
        findViewById(R.id.button_2)
            .setOnClickListener(this);

    }
    @Override
    public void onClick(View v) {
        int id = v.getId();
        int [] searchAttr = {R.attr.is_red};
        TypedArray attrs
            = v.getContext()
               .obtainStyledAttributes(null, searchAttr);
        boolean isRed = attrs.getBoolean(0, false);
        Log.d(TAG, String.format("%s:%b"
            , (id == R.id.button_1) ? "button 1" : "button 2"
            , isRed )
        );
    }
}

Все отлично компилируется и кнопкацвета работают, и я не получаю никаких предупреждений.Но логическое значение isRed в методе onClick всегда возвращает значение false.

Я весь день просматривал сеть и документы, и похоже, что это должно работать - но это не так.Что я делаю не так?
Спасибо
Стив С.

********* РЕДАКТИРОВАТЬ Пт 21 сентября 10:17:01 PDT 2018 *********
Как отмечено ниже, это прототип приложения с около 250 различными кнопками в виде сетки.Существует около 250 основных 4 различных типов, и я могу установить почти все в каждой кнопке, используя один из 4 различных стилей.Я уже использовал тег и текстовые поля, и мне действительно нужен был способ определения типа кнопки (1 0f 4).Наконец-то я создал пользовательский вид кнопок с собственным набором атрибутов.Код рабочей кнопки-прототипа пользовательского представления с атрибутом github .Спасибо!
Стив С.

1 Ответ

0 голосов
/ 20 сентября 2018

Вы не использовали атрибут is_red в своем xml.Как то так:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:custom="http://schemas.android.com/apk/res-auto"

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".CustomAttr">

    <Button
        android:id="@+id/button_1"

        custom:is_red="true"

        style="@style/red_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1!" />

    <Button
        android:id="@+id/button_2"

        custom:is_red="false"

        style="@style/blue_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2!" />

</LinearLayout>
...