LoginSignup
3

More than 5 years have passed since last update.

drawable xml内でattrsを参照するとクラッシュするバージョンについての話

Posted at

概要

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以下に人権はない。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3