概要
shapeなどのdrawable xml内でattrs(?
で参照する変数)に参照するとランタイムでクラッシュします。
これはAndroid 4.4まで存在していたバグで、5.0で修正されたと思われていたのですが…
思ってたよりひどかった。
検証コード
attrs参照でクラッシュする記述は2種類あります。
パターンA
shapeで?selectableItemBackground
を使う。
(?
参照なら何でも構いません)
drawable/shape_pattern_a.xml
<layer-list>
<!-- ここ -->
<item android:drawable="?selectableItemBackground" />
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/black" />
<corners android:radius="2dp" />
<padding
android:bottom="4dp"
android:left="8dp"
android:right="8dp"
android:top="4dp" />
</shape>
</item>
</layer-list>
パターンB
attrsを直接使うのではなく、間接参照します。
drawable/shape_pattern_a.xml
<layer-list>
<!-- ここ -->
<item android:drawable="@drawable/mySelectableBackground" />
<item>
<shape android:shape="rectangle">
<solid android:color="@android:color/black" />
<corners android:radius="2dp" />
<padding
android:bottom="4dp"
android:left="8dp"
android:right="8dp"
android:top="4dp" />
</shape>
</item>
</layer-list>
values/drawables.xml
<resources>
<drawable name="mySelectableBackground">?selectableItemBackground</drawable>
</resources>
結果
バージョン | パターンA | パターンB |
---|---|---|
4.4以下 | クラッシュ | クラッシュ |
5.x | OK | クラッシュ |
6.0以上 | OK | OK |
まとめ
4.4以下に人権はない。