2010-01-24 3 views
17

Итак, я осмотрелся и узнал, что android.R.styleable больше не является частью SDK, хотя он все еще задокументирован here.Как использовать getStyledAttributes (int []) с внутренними темами Android

Это не было бы проблемой, если бы было четко зафиксировано, что такое альтернатива. Например AOSP Calendar App все еще использует 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?

+0

Та же проблема существует с галереей Просмотреть учебник, я видел обходные пути, которые делают работу учебника, но никаких объяснений относительно того, как учебник должен быть зафиксирован с помощью только классов SDK и не добавляя свой собственный xml со стилем в нем. Учебное пособие находится по адресу http://developer.android.com/resources/tutorials/views/hello-gallery.html, код находится в «ImageAdapter (Context c)». Конструктор – AGrunewald

+0

. Вот аналогичная дискуссия http://stackoverflow.com/q/8793183/1307690 – Lemberg

ответ

12

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

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

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

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

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

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

+2

Спасибо за информацию, помогает совсем немного. Насколько я понимаю, создается Xml Styleable, например. одним из атрибутов является «android: backgroundDimAmount», который позволяет App получать правильные данные. Что касается материала, находящегося в SDK. Я понимаю, что есть много ценных документов, но объяснение, почему класс находится в документе SDK, а не в самом SDK прямо в Справочнике API, может в будущем прояснить ситуацию для разработчиков, поскольку все еще есть учебники, которые это делают Неправильно: http://developer.android.com/intl/zh-CN/resources/tutorials/views/hello-gallery.html – AGrunewald

+0

@hackbod Первая ссылка в ответе устарела. – Pang

4

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

Как worksaround, вы можете использовать отражение для доступа к полю:

Class clazz=Class.forName("android.R$styleable"); 
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz); 
+0

Ну, по словам Дианы Хакборн, это было намеренно удалено из SDK, спрятав его. Здесь Обсуждение об этом http://groups.google.com/group/android-developers/tree/browse_frm/thread/6554c6688f3ca6d9/8d018aa3f5c2beb9?rnum=1&_done=%2Fgroup%2Fandroid-developers%2Fbrowse_frm%2Fthread%2F6554c6688f3ca6d9% 3Ftvc% 3D1% 26 # doc_72f29c1df624bbed Так есть способ сделать это правильно, не используя отражение? – AGrunewald

+0

Если это намеренно ушло, вы не должны его использовать. Внутренние приложения (например, Календарь) могут использовать его, поскольку они не ограничены использованием SDK. Кроме того, у меня нет никаких советов, извините. Я обновил проблему, чтобы попытаться получить ответы. – CommonsWare

+2

Спасибо, я согласен Я не должен его использовать, но тогда должна быть альтернатива. И Галерею View Tutorial нужно было обновить давным-давно, так как она все еще показывает этот код. – AGrunewald

13

В примере, они вышли из ссылки на контекст «C»:

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

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

+2

Я знаю, что это происходит поздно, но это правильный ответ !!! –

7

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

Это часть моих стилей.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> 
Смежные вопросы