Androidアプリ開発

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

この記事は約9分で読めます。
記事内に広告が含まれています。
スポンサーリンク

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

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

この記事のテーマ


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

ポイント

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

使用できないメニューの文字色を変更した例

ActionMenuViewのレイアウト定義

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

         :
        <!-- メニュー -->
        <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" />
        :

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

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

    :
    <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>
    :

メニューの実装

メニューの実装では、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_backup));
        actionMenuView.getMenu().add(Menu.NONE, 1, Menu.NONE,context.getString(R.string.menu_restore));
        actionMenuView.getMenu().add(Menu.NONE, 2, Menu.NONE,context.getString(R.string.menu_import));
        actionMenuView.getMenu().add(Menu.NONE, 3, Menu.NONE,context.getString(R.string.menu_start));
        actionMenuView.getMenu().add(Menu.NONE, 4, Menu.NONE,context.getString(R.string.menu_stop));
        actionMenuView.getMenu().add(Menu.NONE, 5, Menu.NONE,context.getString(R.string.menu_subscription));
        actionMenuView.getMenu().add(Menu.NONE, 6, Menu.NONE,context.getString(R.string.menu_course));
        actionMenuView.getMenu().add(Menu.NONE, 7, Menu.NONE,context.getString(R.string.menu_system));
        actionMenuView.getMenu().add(Menu.NONE, 8, Menu.NONE,context.getString(R.string.menu_clear));
        actionMenuView.getMenu().add(Menu.NONE, 9, Menu.NONE,context.getString(archive ? R.string.menu_edit : R.string.menu_archive));
        actionMenuView.getMenu().add(Menu.NONE, 10, 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);
        setActionMenuView(actionMenuView.getMenu().getItem(6));
        setActionMenuView(actionMenuView.getMenu().getItem(7));
        :

    // 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);
    }
    public void setActionMenuView(MenuItem menuItem) {
        SpannableString spannableString = new SpannableString(menuItem.toString());
        spannableString.setSpan(new UnderlineSpan(), 0, spannableString.length(), 0);
        spannableString.setSpan(new StyleSpan(Typeface.BOLD), 0, spannableString.length(), 0);
        menuItem.setTitle(spannableString);
    }
}

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

今回は、ここまでです。

誤字脱字、意味不明でわかりづらい、
もっと詳しく知りたいなどのご意見は、
このページの最後にある
コメントか、
こちら
から、お願いいたします♪

ポチッとして頂けると、
次のコンテンツを作成する励みになります♪

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

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

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

未経験者からシステムエンジニアを目指すのに最適です。まずは無料相談から♪

未経験者からプログラマーを目指すのに最適です。まずは無料カウンセリングから♪

カリキュラムとサポートがしっかりしています。お得なキャンペーンとかいろいろやっています♪

ゲーム系に強いスクール、UnityやUnrealEngineを習得するのに最適です。まずは無料オンライン相談から♪

参考になったら、💛をポッチとしてね♪

スポンサーリンク
msakiをフォローする
スポンサーリンク

コメント欄

タイトルとURLをコピーしました