2012年4月8日日曜日

オプションメニューの作成と変更

オプションメニューの作成と変更

副題:複雑な形状のオプションメニューを作成し、必要に応じ、メニューの一部を削除する。

形状が複雑なオプションメニューはJavaのcodeで書くよりも、xmlで書いた方が視認性が高まる。
sampleは次のとおりである。
resフォルダーの直下にmenuという名前のフォルダーを作成し、menuフォルダーの直下に、このxmlファイルを配置する。このsampleでは、このxmlファイル名は、menu_inputactivity.xmlである。
<?xml version="1.0" encoding="utf-8"?>

<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    >
    <item
        android:id="@+id/Menu_Setting"
        android:title="@string/Menu_Setting"
        >
    </item>
    <item
        android:id="@+id/Menu_Display"
        android:title="@string/Menu_Display"
        >
        <menu>
            <item
                android:id="@+id/Menu_ShowButtons"
                android:title="@string/Menu_ShowButtons"
                >
            </item>
            <item
                android:id="@+id/Menu_HeightSize"
                android:title="@string/Menu_HeightSize"
                >
            </item>
        </menu>
    </item>
    <item
        android:id="@+id/Menu_Quit"
        android:title="@string/Menu_Quit"
        >
    </item>
</menu>

このメニューを任意のActivityに作成するsample codeは次のとおりである。必要に応じ、任意のメニューを削除する。
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inf;
        
        inf = getMenuInflater();
        inf.inflate(R.menu.menu_inputactivity, menu);
        if(p!=null && p.iInputMethod==1){//必要に応じ
            MenuItem mi;
            mi = menu.findItem(R.id.Menu_Display);
            if(mi!=null){//サブメニューのメニューを削除する。
                SubMenu sub;
                sub = mi.getSubMenu();
                sub.removeItem(R.id.Menu_ShowButtons);
            }
        }
        return super.onCreateOptionsMenu(menu);
    }

onCreateOptionsMenuメソッドは、Activityの起動時に1回しか呼ばれない。そういう意味で、上記のJava codeだと、「静的に」メニューを作成したことになる。
動的にメニューを変更するのであれば、下記のようにonPrepareOptionsMenuメソッドを組み合わせて使うことになる。
    @Override

    public boolean onCreateOptionsMenu(Menu menu){
        MenuInflater inf;
        inf = getMenuInflater();
        inf.inflate(R.menu.menu_inputactivity, menu);
        return super.onCreateOptionsMenu(menu);
    }
    
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        if(p==null) return super.onPrepareOptionsMenu(menu);
        MenuItem mi;
        SubMenu sub;
        mi = menu.findItem(R.id.Menu_Display);
        sub = mi.getSubMenu();
        mi = sub.findItem(R.id.Menu_ShowButtons);
        if(p.iInputMethod==1){//必要に応じ
            if(mi!=null) sub.removeItem(R.id.Menu_ShowButtons);
        }
        else{
            if(mi==null){
                sub.add(Menu.NONE, R.id.Menu_ShowButtons,
                    Menu.NONE, R.string.Menu_ShowButtons);
            }
        }
        return super.onPrepareOptionsMenu(menu);
    }

0 件のコメント:

コメントを投稿