10

getResourceId()メソッドに関するドキュメントを読んでいます。次のように述べています。

インデックスの属性のリソース識別子を取得します。TypedArray オブジェクト全体が取得されると、属性リソースが解決されることに注意してください。結果として、この関数は見つかった最終的なリソース値のリソース識別子を返しますが、必ずしも属性によって指定された元のリソースではありません。

そう

  • 最初の段落は明らかです。

インデックスの属性のリソース識別子を取得します。

  • 2番目も明らかです:

TypedArray オブジェクト全体が取得されると、属性リソースが解決されることに注意してください。

  • しかし、3段落はどういう意味ですか? 必ずしも元のリソース IDを返すとは限らないのはなぜ ですか?

結果として、この関数は見つかった最終的なリソース値のリソース識別子を返しますが、必ずしも属性によって指定された元のリソースではありません。

4

2 に答える 2

5

ドキュメントから :

TypedArray obtainStyledAttributes (AttributeSet set, 
                int[] attrs, 
                int defStyleAttr, 
                int defStyleRes)

....

特定の属性の最終的な値を決定する場合、次の 4 つの入力が有効になります。

  1. 指定された AttributeSet 内の任意の属性値。
  2. AttributeSet で指定されたスタイル リソース (「スタイル」という名前)。
  3. defStyleAttr と defStyleRes で指定されたデフォルトのスタイル
  4. このテーマの基本値。
于 2016-06-14T18:54:56.643 に答える
1

これは、が取得される前にリソース マージが発生する必要があるためです。TypedArray

Gradle ベースのビルド システムは、リソースの新しいマージ メカニズムを使用します。以前のビルド システムでは、マージは、オーバーレイとして機能する aapt にリソース フォルダーのリストを渡すことで行われ、オーバーレイ内の新しいリソースが自動的に追加されるように --auto-add-overlay が指定されていました (デフォルトの動作はオーバーレイの場合です)。既存のリソースのみをオーバーライドし、新しいリソースを作成しない)。

Gradle ベースのビルド システムの目標の 1 つは、より高い柔軟性を提供することでした。また、よく寄せられる機能要求の 1 つは、複数のリソース フォルダーを持つ機能でした。aapt はこれを処理できないため、新しいビルド システムは aapt の前に実行される新しいマージ メカニズムを導入し、aapt に供給される単一のマージされたリソース フォルダーを生成します。このマージには、Gradle の入力/出力変更検出と実装方法の両方で、インクリメンタルであるという利点があります (つまり、単一のファイルに変更を適用するだけでマージを再実行できます)。

マージされたリソースは、3 種類のソースから取得されます。

  • 主な sourceSet に関連付けられた主なリソースは、通常 src/main/res にあります。
  • ビルド タイプとフレーバーに由来するバリアント オーバーレイ。
  • aar バンドルの res エントリを通じてリソースを提供するライブラリ プロジェクトの依存関係。

たとえば、異なるものを使用する場合productFlavors、またはbuildTypesフレーバーごとに異なるリソースを使用する場合があります。そのため、開発時に最初に設定したものと、実際にフレーバーを変更した後に提供されるものは異なる場合があります。

于 2016-06-09T06:24:41.007 に答える