1. ホーム
  2. android

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

2023-11-07 07:50:52

質問

Android 3.0 では、"checked" の概念は "activated" の背景を使用してレンダリングすることができます。これにより、リストの断片をタップしたときに表示される永続的なバーが得られ、リストの右側の断片にコンテキストを提供します (たとえば、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 の新機能です。何がそれを "activated" にするのか。

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

この属性値は Android 3.0 の新機能で、私が知る限りでは、以前のバージョンの Android で使おうとするとクラッシュします。3.0/large/landscape の組み合わせでは背景をこの魔法の値に設定し、それ以外ではスキップしたいのです。

レイアウトの2つの別々のバージョンを持つことによってこれを達成することができ、1つは -v11 リソースセットと通常のリソースセットです。レイアウトの大部分は同じで、この 1 つの属性だけが含まれたりスキップされたりするからです。

私は、描画可能なリソースのエイリアスを使用することに挑戦してみました。 android:background がエイリアスを参照し、エイリアスが -v11 の区別がつきますが <bitmap> は描画対象が android:src="@null" .

この問題にはスタイルとテーマのアプローチがあると思いますが、私はそのことについて完全に理解したことがないので (もっと恥ずかしい Android の知識のギャップの 1 つ)、どうすればよいのか完全にわかりません。

3.0 で "activated" を使用し、3.0 より前のバージョンでそれをスキップするための、個別のレイアウトを超えたパターンを解決した人はいますか?

ありがとうございます!

どのように解決するのですか?

スタイルはあなたの味方です...。

2つのvaluesディレクトリを持ち、1つはvalues-v11、もう1つはデフォルトのvaluesです。

それぞれのvaluesディレクトリはstyles.xmlを含んでいますが、違いはデフォルトのvaluesのほうに含まれていることです。

<style name="listViewActivatedStyle"/>

values-v11に含まれる。

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

とすると、使用するレイアウトは1つで済む。

style="@style/listViewActivatedStyle"

と表示され、適切なものが選択されます。