Как я могу использовать receiveStyledAttributes (int []) с внутренними темами Android - PullRequest
19 голосов
/ 24 января 2010

Итак, я осмотрелся и обнаружил, что 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?

Ответы [ 4 ]

15 голосов
/ 22 сентября 2010

В этом примере они оставили ссылку на контекст '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 должно работать

13 голосов
/ 25 января 2010

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

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 (и, пожалуйста, не используйте какие-либо приемы для доступа к ним). В любом случае не должно быть необходимости использовать платформенные, потому что каждый из них предназначен только для реализации частей фреймворка, и создать свой собственный, как показано здесь, тривиально.

7 голосов
/ 17 августа 2014

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

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>
4 голосов
/ 24 января 2010

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

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

Class clazz=Class.forName("android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...