web-dev-qa-db-ja.com

Androidの内部テーマでgetStyledAttributes(int [])を使用するにはどうすればよいですか?

だから私は周りを見回して、_Android.R.styleable_はまだ文書化されていてもSDKの一部ではなくなっていることを発見しました ここ

代替案が何であるかが明確に文書化されていれば、それは実際には問題にはなりません。たとえば、AOSPカレンダーアプリはまだ_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();
_

では、_int[]_から_Android.R.styleable.Theme_を取得せずに、backgroundDimAmountを取得するにはどうすればよいでしょうか。

SDKで機能させるには、obtainStyledAttributes(int [])に固執する必要がありますか?

19
AGrunewald

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に含めることはできません(また、トリックを使用して配列にアクセスしないでください)。使用する必要はありません。プラットフォームのものはとにかく、フレームワークの一部を実装するためだけに存在するため、ここに示すように独自のものを作成するのは簡単です。

13
hackbod

この例では、コンテキスト '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に変更すると機能するはずです

15
kpasgma

独自のデフォルトスタイルを持つカスタムビューで標準属性(背景)を引き出す例。この例では、カスタムビューPasswordGrid extends GridLayout。標準のAndroid属性Android:backgroundを使用して背景画像を設定するPasswordGridのスタイルを指定しました。

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>
7
LanDenLabs

これはSDKのバグのようです。 issue を提出しました。更新を受け取るために、スターを付けたいと思うかもしれません。

回避策として、リフレクションを使用してフィールドにアクセスできます。

Class clazz=Class.forName("Android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);
4
CommonsWare