Как использовать getStyledAttributes(int []) с внутренними темами Android

StackOverflow https://stackoverflow.com/questions/2127177

Вопрос

Итак, я осмотрелся и обнаружил, что android.R.styleable больше не является частью SDK, хотя все еще документировано. здесь.

Это не было бы проблемой, если бы было четко задокументировано, какова альтернатива.Например, приложение AOSP Calendar по-прежнему использует android.R.styleable

// Get the dim amount from the theme   
TypedArray a = obtainStyledAttributes(com.android.internal.R.styleable.Theme);
lp.dimAmount = a.getFloat(android.R.styleable.Theme_backgroundDimAmount, 0.5f);
a.recycle();

Так как же получить backgroundDimAmount не получив int[] от android.R.styleable.Theme?

Что я должен придерживаться obtainStyledAttributes(int []) чтобы заставить его работать с SDK?

Это было полезно?

Решение

Демонстрация CustomView API показывает, как получить стилизованные атрибуты.Код представления находится здесь:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/src/com/example/android/apis/view/LabelView.java

Стилизуемый массив, используемый для получения текста, цвета и размера, определен в файле <declare-styleable> раздел здесь:

https://github.com/android/platform_development/blob/master/samples/ApiDemos/res/values/attrs.xml#L24

Вы можете использовать <declare-styleable> чтобы определить любой список атрибутов, которые вы хотите получить, как группу, содержащую как ваши собственные, так и атрибуты, определенные платформой.

Что касается этих вещей, описанных в документации, то по стилевым массивам есть много документации Java, что делает их полезными для включения в документацию, поэтому они остались там.Однако по мере изменения массивов, например, при добавлении новых атрибутов, значения констант могут меняться, поэтому платформенные константы не могут находиться в SDK (и, пожалуйста, не используйте никаких уловок, чтобы попытаться получить к ним доступ).В любом случае не должно быть необходимости использовать платформенные, потому что каждый из них предназначен только для реализации частей фреймворка, и создать свой собственный, как показано здесь, несложно.

Другие советы

В примере они пропустили ссылку на контекст «c»:

public ImageAdapter(Context c) {
    TypedArray a = c.obtainStyledAttributes(R.styleable.GalleryPrototype);
    mGalleryItemBackground = a.getResourceId(
            R.styleable.GalleryPrototype_android_galleryItemBackground, 0);
    a.recycle();
    return mGalleryItemBackground;
}

Изменение getStyledAttributes на c.obtainStyledAttributes должно работать

Пример извлечения стандартного атрибута (фона) в пользовательском представлении, имеющем собственный стиль по умолчанию.В этом примере пользовательское представление Сетка паролей простирается Макет сетки.Я указал стиль для PasswordGrid, который устанавливает фоновое изображение с использованием стандартного атрибута Android. Android: фон.

public class PasswordGrid extends GridLayout {

    public PasswordGrid(Context context) {
        super(context);
        init(context, null, 0);
    }

    public PasswordGrid(Context context, AttributeSet attrs) {
        super(context, attrs, R.attr.passwordGridStyle);
        init(context, attrs, 0);
    }

    public PasswordGrid(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context, attrs, defStyle);
    }

    private void init(Context context, AttributeSet attrs, int defStyle) {
        if (!isInEditMode()) {

            TypedArray stdAttrs = context.obtainStyledAttributes(attrs,
                    new int[] { android.R.attr.background },  // attribute[s] to access
                    defStyle, 
                    R.style.PasswordGridStyle);  // Style to access

           // or use any style available in the android.R.style file, such as
           //       android.R.style.Theme_Holo_Light

            if (stdAttrs != null) {
                Drawable bgDrawable = stdAttrs.getDrawable(0);
                if (bgDrawable != null)
                    this.setBackground(bgDrawable);
                stdAttrs.recycle();
            }
        }
    }

Вот часть моего файла Styles.xml:

 <declare-styleable name="passwordGrid">
    <attr name="drawOn" format="color|reference" />
    <attr name="drawOff" format="color|reference" />
    <attr name="pathWidth" format="integer" />
    <attr name="pathAlpha" format="integer" />
    <attr name="pathColor" format="color" />
 </declare-styleable>



  <style name="PasswordGridStyle" parent="@android:style/Widget.GridView" >  
      <!--  Style custom attributes.  -->
      <item name="drawOff">@drawable/ic_more</item>
      <item name="drawOn">@drawable/ic_menu_cut</item>
      <item name="pathWidth">31</item>
      <item name="pathAlpha">129</item>
      <item name="pathColor">@color/green</item>

      <!-- Style standard attributes -->
      <item name="android:background">@drawable/pattern_bg</item>
</style>

Похоже, это ошибка в SDK.я подал проблема на нем, который вы, возможно, захотите отметить, чтобы получать обновления.

В качестве обходного пути вы можете использовать отражение для доступа к полю:

Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top