アプリケーションを実行しているプラットフォームよりも新しいプラットフォーム用に設計されたテーマとスタイルから属性値を読み取ろうとしています。
理由を聞かないでください。私が書いたライブラリについて何か知っているなら、私がプラットフォームの機能をプッシュしたいことをすでに知っているはずです:)
私は、Android スタイルがコンパイルされるときに属性定数がキーに使用されるものであるため、理論的にはどのプラットフォームでも何らかの方法で読み取ることができるはずであるという前提で操作しています。これは、他のライブラリのレイアウト XML で問題なく発生していることを確認したものです。
問題を示すベース テスト ケースを次に示します。これは、Android 3.0 以降を使用してコンパイルする必要があります。
<resources>
<style name="Theme.BreakMe">
<item name="android:actionBarStyle">@style/Widget.BreakMe</item>
</style>
<style name="Widget.BreakMe" parent="android:Widget">
<item name="android:padding">20dp</item>
</style>
</resources>
これがandroid:actionBarStyle
特に使用するという事実は無関係です。理解する必要があるのは、Android 3.0 以降でのみ使用できる属性であるということだけです。
Android 3.0 より前のプラットフォームでこれまでにこれらの値にアクセスしようとした方法を次に示します。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Break Me"
style="?android:attr/actionBarStyle"
/>
と
<declare-styleable name="Whatever">
<item name="datStyle" format="reference" />
</declare-styleable>
<style name="Theme.BreakMe.Take2">
<item name="datStyle">?android:attr/actionBarSize</item>
</style>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Break Me"
style="?attr/datStyle"
/>
と
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.actionBarStyle, outValue, true);
と
int[] Theme = new int[] { android.R.attr.actionBarSize };
int Theme_actionBarSize = 0;
TypedArray a = context.obtainStyledAttributes(attrs, Theme);
int ref = a.getResourceId(Theme_actionBarSize, 0);
と
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ActionBar, android.R.attr.actionBarStyle, 0);
それらはすべて、LogCat で次のエラーになります。
E/ResourceType(5618): Style contains key with bad entry: 0x010102ce
0x010102ce
定数は、その値にアクセスする機会を得る前に、プラットフォームが属性を拒否していることを示しているように見える属性値ですandroid.R.attr.actionBarStyle
。
このような属性をテーマから読み取る他の方法を探しています。スタイル リファレンスを取得すれば、その属性の読み取りに問題はないと確信しています。
これを行う方法はありますか?