2011-12-30 6 views
1

スタイル属性を動的に取得する方法はありますか?スタイル属性を動的に取得する

例えば、リソースIDを見つけるために、私が使用することができます:スタイル属性を取得するには、これに似た何かが

context.getResources().getIdentifier("idtofind", "id", context.getPackageName()); 

ありますか?

少し背景...私はカスタムスライド式引き出しを持っているライブラリを持っています。これは、プロジェクトの/values/attrs.xmlにカスタムスタイルの属性を持っています。

私はそれをGLEのUIにドロップしましたが、ハンドルとコンテンツのIDを見つけることができないため、表示されません。 styleableは、int型の配列なので、getIdentifier()は動作しませんように私は、上記目的を達成するかどうかはわかりません

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DrawerSlider, defStyle, 0); 

:行はこれです。

EDIT:

[OK]を、私は物事が今のコードの罰金に仕事を得ることができたが、それでもGLEとの問題を抱えてきました。もう少し明確にするつもりです。私が言ったように、これは自由に利用できる図書館のためのものです。

テストの結果、getIdentifierを使用しても機能しないことが判明しました。アプリケーションを実行していない限り、常に0が返されます。今、私は必要なすべての属性(ハンドル、コンテンツ、方向など)のIDを取得するためにAttributeSetを手動で解析しています。 GLEはこれを処理するとき、それを表すリソースintではなく、+ id/handleを返します。

GLEがR.id static intに直接フィードするのは唯一のようです。新しいバージョンのADT(私はr17にあります)を参照すると、ライブラリのリソースを参照することはできません。必要なリソースIDを動的にフィードする方法はありません。

現時点では、これを機能させる唯一の方法は、ユーザのプロジェクトにドロワ自体のソースファイルを配置することです。可能であれば、これを避けたいと考えています。それは、新しいプロジェクトの作成時にプロジェクトのソースディレクトリに配置するか、右クリックサブメニューコマンドを追加して配置することを意味します。どちらもちょうど良い回避策のように思えます。

答えて

3

実際には、スタイル可能な配列について特別なことはありません。すべてのobtainStyledAttributes()は、属性ごとに個別の呼び出しを実行する必要がなく、1回の呼び出しで複数の属性のバッチを取得することができます。したがって、スタイル可能な配列は属性のリソース識別子の配列に過ぎません。 は、の構造上の特別な要件です。リソース識別子はソート順にする必要があります。これは、リソース識別子を素早く検索するための最適化の一部であるためです。したがって、独自の配列を作成する場合は、そこに配置した識別子が適切にソートされていることを確認する必要があります。 ID番号がわからない場合は、表示されたコードを使用して、それぞれの値を取得することができます...ただし、obtainStyledAttributes()を呼び出すたびにその設定をすべて行うことは、関数から。

+0

を試みることができるが、hackbod、ありがとうございました。これが私の 'obtainStyledAttributes()'の問題に対する答えであることを理解する前に、これを3回読んでいるに違いありません。 Imho、ドキュメントでこれが言及されていれば良いでしょう。 –

+0

私はTypedArrayを取得すると、リソースIDに含まれるすべてのリソースIDを調べる方法を知りませんので、リソース識別子に対して正しい「ソート」順序がどのように決定されるのか理解できません。私の神、どうしたの? – rmirabelle

2

あなたは

TypedValue outValue = new TypedValue(); 
context.getTheme().resolveAttribute(R.attr.someAttribute, outValue, true); 
return outValue.resourceId; 
関連する問題