Androidのmenu.xmlでactionLayoutを指定しているレイアウトが表示されないとき

f:id:shaunkawano:20200105183941p:plain

今後忘れた頃にまた踏みそうだなと思ったので、備忘録として。

前提

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/some_id"
        android:title="@string/some_menu_item_title"
        android:actionLayout="@layout/some_action_layout"
        app:showAsAction="always" />
</menu>

このようなコードがあったとき、なぜかtitleで指定している文字が表示され、actionLayoutで指定しているレイアウトが表示されなった。

解決策

android:actionLayout="@layout/some_action_layout"

↑これを

↓こうする

app:actionLayout="@layout/some_action_layout"

以下に書いてあります: stackoverflow.com

android:とapp:の違い?

stackoverflow.com

stackoverflow.com

android:はAndroid SDKが提供するUIのattributeの値指定に利用できるもので、app:は基本的にはカスタムViewに対してattributeを用いて値を変更したいときなどに利用できるものらしそう、というところまではわかる。が、カスタムネームスペースというのは開発者がカスタムViewなどを定義したときのみに利用できてほしいところが、実際のところ、今回のようなmenu xmlのactionLayoutの指定といった、Androidプラットフォームが提供しているAPIに対しても使うことがある。他にも、app:srcCompatなど。

AndroidプラットフォームのAPIを利用する際、いつandroid:を使い、いつapp:を使うのか。対応がまとまっていると嬉しいなと思ったが、そのようなリソースは見つけれていない。

もし知っている方がいたら教えていただけると嬉しいです🙏