環境
- Pixel 3a
- Android 12 beta 5 (ビルド番号 SPB5.210812.002)
症状
AndroidでWebKit上のコンテキストメニューをカスタマイズする場合、WebKitクラスを継承したサブクラスを作成し、そこで以下のようにonActionModeStarted()
をオーバーライドする。
@Override public void onActionModeStarted(ActionMode mode) { Menu menu = mode.getMenu(); // "コピー"と"全て共有"を削除 removeMenuItemByTitle(menu, getResources().getString(android.R.string.copy)); removeMenuItemByTitle(menu, getResources().getString(android.R.string.selectAll)); // メニューを追加 MenuItem textMarkerMenu = menu.add("Test1"); MenuItem textMarkerMenu2 = menu.add("Test2"); super.onActionModeStarted(mode); }
しかし、Android 12では以下のように変更が反映されない。
解決方法
onActionModeStarted()
の最後にinvalidateContentRect()
を実行する。
@Override public void onActionModeStarted(ActionMode mode) { Menu menu = mode.getMenu(); // "コピー"と"全て選択"を削除 removeMenuItemByTitle(menu, getResources().getString(android.R.string.copy)); removeMenuItemByTitle(menu, getResources().getString(android.R.string.selectAll)); // メニューを追加 MenuItem textMarkerMenu = menu.add("Test1"); MenuItem textMarkerMenu2 = menu.add("Test2"); // 以下を追加 mode.invalidateContentRect(); super.onActionModeStarted(mode); }
これで以下のように変更が反映される。*以下では"共有"メニューも削除している。
おまけ
invalidateContentRect()
の代わりに invalidate()
を実行するとメニューの追加は反映されるが、削除が反映されない。