web-dev-qa-db-ja.com

設定Android背景と持続性メニューバー-古いバージョンで属性を使用するとクラッシュする-テーマ/パターンアプローチはありますか?

Android 3.0では、「チェック済み」の概念は「アクティブ化された」背景を使用してレンダリングできます。これにより、リストフラグメントをタップしたときに表示される永続的なバーが提供され、フラグメントのコンテキストが提供されますリストの右側に表示されます(たとえば、Gmailのフォルダーをタップすると、そのフォルダーが強調表示され、別のリストフラグメントが開いて、そのフォルダー内の会話が表示されます)。

たとえば、フラグメントのサンプルは次のようなものを示しています。

setListAdapter(new ArrayAdapter<String>(getActivity(),
                    Android.R.layout.simple_list_item_activated_1, Shakespeare.TITLES));

そのリソース(Android.R.layout.simple_list_item_activated_1)は、Android 3.0で新しく追加されました。「アクティブ化」する理由は次のとおりです。

Android:background="?android:attr/activatedBackgroundIndicator"

その属性値は、Android 3.0で新しく追加されたものであり、以前のバージョンのAndroidで使用しようとすると、私がわかる範囲でクラッシュします。背景をこの魔法の値に設定したい3.0/large/landscapeの組み合わせの場合、それ以外の場合はスキップします。

これは、レイアウトの2つの異なるバージョン(1つは-v11リソースセット内、もう1つは通常のリソースセット内)で実現できます。 DRYですが、レイアウトの大部分は同じであり、この1つの属性のみが含まれるかスキップされるため、これは希望よりも少し少ないです。

ドローアブルリソースエイリアスの使用を試みたので、Android:backgroundはエイリアスを参照でき、エイリアスは-v11の区別を処理しますが、<bitmap>ドローアブルは好きではないようですAndroid:src="@null"

私はこの問題にスタイルとテーマのアプローチがあると思いますが、私はそれらに頭を完全に包んだことがないので(私の恥ずかしいAndroid知識のギャップの1つ)、私はそうではありません何をすべきか完全に確信しています。

個別のレイアウトを超えて、3.0で「アクティブ化」を使用し、3.0より前でそれをスキップするためのパターンを考え出した人はいますか?

ありがとう!

74
CommonsWare

スタイルはあなたの友達です...

2つの値ディレクトリがあり、1つはvalues-v11、もう1つはデフォルト値です。

各値ディレクトリには、styles.xmlが含まれます。違いは、デフォルト値に含まれるものです。

<style name="listViewActivatedStyle"/>

Values-v11には以下が含まれます。

<style name="listViewActivatedStyle">
   <item name="Android:background">?android:attr/activatedBackgroundIndicator</item>
</style>

次に、使用する単一のレイアウトを持つことができます。

style="@style/listViewActivatedStyle"

そして、適切なものが選択されます。

57
Al Sutton