Androidアプリ開発

ActionMenuViewで
使用不可メニューの色を変更する

この記事は約10分で読めます。
スポンサーリンク

※当サイトではアフィリエイト広告を利用しています

こんにちは、まっさん(@Tera_Msaki)です。

この記事はAndroidスマホ用のアプリ開発の中で、
今後の開発で再使用性が高いと思われるコーディングをまとめたものです。
Javaでの開発経験、XML構文規則、Androidのアプリ開発経験がある方を対象としています。
Androidのアプリ開発でお役にたててれば、嬉しいです。
(これからAndroidのアプリ開発やJavaでの開発を始めたい方への案内は、記事の最後で紹介します)

◎テーマ
ActionMenuViewで使用不可のメニューの文字色を変更する

◎ポイント

Androidスマホのアプリ開発でメニューを使用する場合、
使用できないメニューアイテムをユーザに通知する仕組みとして、
メニューアイテムの色を変更することは有効な手段のひとつです。
メニューの実装では、ActionMenuView を使用します。
メニューの背景、メニューアイテムの文字の色などの指定は、styles.xml に定義しますが、
文字の色は1つしか指定できません。
使用できるメニューと使用できないメニューで文字の色を変えるには、
ひと工夫する必要があります。

使用できないメニューアイテムとして、バックアップとリストアの文字色を変更した例です。

◎ActionMenuViewのレイアウト定義

         :
        <!-- メニュー -->
        <androidx.appcompat.widget.ActionMenuView
            android:id="@+id/menu"
            android:layout_width="56dp"
            android:layout_height="56dp"
            android:layout_alignParentStart="true"
            android:layout_alignParentTop="true"
            android:theme="@style/ActionMenuViewStyle" />
        :

メニューの背景、文字の色などの指定を styles.xml に themeとして定義します。
ActionMenuViewはメニューを開いていない状態のサイズとして、
最低でも幅と高さは 56dp 必要なようです。

◎メニューの背景、文字の色などの指定

    :
    <style name="ActionMenuViewStyle">
        <item name="android:colorBackground">@color/white</item>
        <item name="android:textColor">@color/black</item>
        <item name="android:textColorSecondary">@color/black</item>
    </style>
    :

メニューの背景の指定は、android:colorBackground で色を指定します。
メニューアイテムの文字色(通常)の指定は、android:textColor で色を指定します。
ActionMenuViewはメニューを開いていない状態の色の指定は、
android:textColorSecondary で色を指定します。

◎メニューの実装

メニューの実装では、Activity (または、Fragment)の onCreate などで ActionMenuView のオブジェクトを取得して、
メニューアイテムを定義します。
定義したメニューアイテムの制御で、使用不可のメニューアイテムの無効化と色を変更します。

    :
    private ActionMenuView              actionMenuView;
    :
    // OnCreate
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        : 
        // メニューアイテムの定義
        actionMenuView = findViewById(R.id.menu);
        actionMenuView.getMenu().add(Menu.NONE, 0, Menu.NONE,context.getString(R.string.menu_course));
        actionMenuView.getMenu().add(Menu.NONE, 1, Menu.NONE,context.getString(R.string.menu_system));
        actionMenuView.getMenu().add(Menu.NONE, 2, Menu.NONE,context.getString(R.string.menu_backup));
        actionMenuView.getMenu().add(Menu.NONE, 3, Menu.NONE,context.getString(R.string.menu_restore));
        actionMenuView.getMenu().add(Menu.NONE, 4, Menu.NONE,context.getString(R.string.menu_clear));
        actionMenuView.getMenu().add(Menu.NONE, 5, Menu.NONE,context.getString(R.string.menu_start));
        actionMenuView.getMenu().add(Menu.NONE, 6, Menu.NONE,context.getString(R.string.menu_stop));
        actionMenuView.getMenu().add(Menu.NONE, 7, Menu.NONE,context.getString(R.string.menu_subscription));
        actionMenuView.getMenu().add(Menu.NONE, 8, Menu.NONE,context.getString(R.string.menu_help));
        :

    // OnResume
    @Override
    protected void onResume() {
        super.onResume();
        :
        // メニューアイテムの制御
        setActionMenuView(actionMenuView.getMenu().getItem(2), context.getColor(R.color.grey), false);
        setActionMenuView(actionMenuView.getMenu().getItem(3), context.getColor(R.color.grey), false);
        :

    // ActionMenuView制御 //
    private void setActionMenuView(MenuItem menuItem, int color, boolean enable) {
        SpannableString spannableString = new SpannableString(menuItem.toString());
        spannableString.setSpan(new ForegroundColorSpan(color), 0, spannableString.length(), 0);
        menuItem.setTitle(spannableString);
        menuItem.setEnabled(enable);
    }
}

ActionMenuView のメニューアイテムの文字の色を変更するには、SpannableString クラスで文字の色を変更して、ActionMenuView のメニューアイテムを上書きする必要があります。
メニューアイテムを使用不可にする場合、setEnabled メソッドで false をセットします。

ブログランキング・にほんブログ村へ

◎これからAndroidのアプリ開発やJavaでの開発を始めたい方へ

初めてのAndroidのアプリ開発では、アプリケーション開発経験がない方や、
アプリケーション開発経験がある方でも、JavaやC#などのオブジェクト指向言語が初めての方は、
書籍などによる独学ではアプリ開発できるようになるには、
かなりの時間がかかりますので、オンラインスクールでの習得をおススメします。

コメント欄