Установка значения для пользовательских атрибутов Android - PullRequest
1 голос
/ 12 июня 2019

У меня есть собственный атрибут, например, такой:

<attr name="colorPrimarySdk" format="color"/>
<attr name="colorSecondarySdk" format="color"/>
<attr name="colorAccentSdk" format="color"/>

И я использую их в своих стилях следующим образом:

<style name="MyTheme" parent="Theme.AppCompat.Light.NoActionBar">
     <item name="colorPrimary">?colorPrimarySdk</item>
     <item name="colorPrimaryDark">?colorSecondarySdk</item>
     <item name="colorAccent">?colorAccentSdk</item>
</style>

Теперь мне нужно динамически установить значение моих атрибутов из кода, например:

colorPrimarySdk.value = myCustomColor

Я уже пытался использовать TypedValue и получить доступ к самому атрибуту. Если кто-то может помочь изменить значение для моего пользовательского атрибута, это было бы очень полезно. Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Определите цвета для определенной темы в вашем файле цветов:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="my_link_color1">#0077CC</color>
    <color name="my_link_color2">#626262</color>
</resources>

Создайте файл res / values ​​/ attrs.xml с содержанием:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="myLinkColor" format="reference" />
</resources>

Предположим, у нас есть 2 темыв нашем файле styles.xml (Theme1 и Theme2) определите:

<style name="Theme1" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myLinkColor">@color/my_link_color1</item>
</style>

<style name="Theme2" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="myLinkColor">@color/my_link_color2</item>
</style>

Используйте цвет в XML:

android:textColor="?attr/myLinkColor"
0 голосов
/ 12 июня 2019

это сложно:)

colors.xml:

    <?xml version="1.0" encoding="utf-8"?>
      <resources>
      <color name="your_special_color">#FF0099CC</color>
    </resources>

Res.java:

public class Res extends Resources {

    public Res(Resources original) {
        super(original.getAssets(), original.getDisplayMetrics(), original.getConfiguration());
    }

    @Override public int getColor(int id) throws NotFoundException {
        return getColor(id, null);
    }

    @Override public int getColor(int id, Theme theme) throws NotFoundException {
        switch (getResourceEntryName(id)) {
            case "your_special_color":
                // You can change the return value to an instance field that loads from SharedPreferences.
                return Color.RED; // used as an example. Change as needed.
            default:
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    return super.getColor(id, theme);
                }
                return super.getColor(id);
        }
    }
}

BaseActivity.java

public class BaseActivity extends AppCompatActivity {

    ...

    private Res res;

    @Override public Resources getResources() {
        if (res == null) {
            res = new Res(super.getResources());
        }
        return res;
    }

    ...

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...