だから私は周りを見回して、_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 [])
に固執する必要がありますか?
CustomView APIデモは、スタイル付き属性を取得する方法を示しています。ビューのコードは次のとおりです。
テキスト、色、サイズを取得するために使用されるスタイル可能な配列は、次の<declare-styleable>
セクションで定義されています。
<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 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>
これはSDKのバグのようです。 issue を提出しました。更新を受け取るために、スターを付けたいと思うかもしれません。
回避策として、リフレクションを使用してフィールドにアクセスできます。
Class clazz=Class.forName("Android.R$styleable");
int i=clazz.getField("Theme_backgroundDimAmount").getInt(clazz);