Action Button の操作

最初の Fragment では新規作成な Button は出さなくて次の Fragment では出す、みたいなナニを試してみました。
Acitivity 側では以下な記述。

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case android.R.id.home:
                finish();
                return true;
            case R.id.action_settings:
                Toast.makeText(this, "setting button", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

で、res/manu/main.xml が以下。

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_add"
        android:orderInCategory="100"
        android:showAsAction="never"
        android:icon="@android:drawable/ic_menu_add"
        android:title="@string/action_add"/>
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_menu_preferences"
        android:title="@string/action_settings"/>
</menu>

いらないや、って思って add な item 消してしまったのですが、id が必要というオチ。なので showAsAction を never にしていたり。
これで_設定_なボタンは両方の Fragment で使える状態になっています。
次は_一つめ_の Fragment における OptionsMenu 関連の記述。って記述ないですね。二つ目の Fragment な記述が以下になります。

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.add(Menu.NONE, R.id.action_add, Menu.NONE, "New Connection")
            .setIcon(android.R.drawable.ic_menu_add)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.action_add:
                Toast.makeText(getActivity(), "add button from VMListFragment", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

選択した場合、Toast しか出してませんが、まだ mockup な段階ってことでご容赦頂ければ幸いです。

その後

ボタンを一つ増やす、ということで res/menu/main.xml を以下にして

<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:showAsAction="ifRoom"
        android:icon="@android:drawable/ic_menu_preferences"
        android:title="@string/action_settings"/>
</menu>

_二つ目_の Fragment のメニュな記述を以下に修正してます。

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.add(Menu.NONE, ADD_ID, Menu.NONE, "New Connection")
            .setIcon(android.R.drawable.ic_menu_add)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
        menu.add(Menu.NONE, RELOAD_ID, Menu.NONE, "Reload")
            .setIcon(android.R.drawable.ic_menu_rotate)
            .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case ADD_ID:
                Toast.makeText(getActivity(), "add button from VMListFragment", Toast.LENGTH_SHORT).show();
                return true;
            case RELOAD_ID:
                Toast.makeText(getActivity(), "reload button from VMListFragment", Toast.LENGTH_SHORT).show();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

ID は先頭で無理気味に定義。

	private final int RELOAD_ID = 0xdeadbeef;
	private final int ADD_ID = 0xdeadbeef + 1;

最近習ったでっどびーふ。あまり意味はなかったり (ぇ