2

I'd like to customize options menu in my app. After some googling and making a lot of effort I am still unable to do it. Here is what I want:

enter image description here

menu.xml file:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <item
    android:id="@+id/menu_first"
    android:icon="@drawable/phone_selector"
    android:title="@string/first"/>

 <item
    android:id="@+id/menu_second"
    android:icon="@drawable/butterfly_selector"
    android:title="@string/second"/>

 <item
    android:id="@+id/menu_third"
    android:icon="@drawable/umbrella_selector"
    android:title="@string/third"/>
</menu>

OptionsMenuActivity.java:

public class OptionsMenuActivity extends Activity {

private Menu currentMenu;

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater menuInflater = getMenuInflater();
    menuInflater.inflate(R.layout.menu, menu);
    this.currentMenu = menu;

    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    super.onPrepareOptionsMenu(menu);
    setMenuItemIconState(menu, MyApplication.getSelectedMenuItemDrawIcon(), false);

    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_phone:
        setMenuItemIconState(currentMenu, MyApplication.getSelectedMenuItemDrawIcon(), true);
        MyApplication.setSelectedMenuItemDrawIcon(R.drawable.phone_active);
        Intent intent = new Intent(OptionsMenuActivity.this, FirstActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;

    case R.id.menu_butterfly:
        setMenuItemIconState(currentMenu, MyApplication.getSelectedMenuItemDrawIcon(), true);
        MyApplication.setSelectedMenuItemDrawIcon(R.drawable.butterfly_active);
        intent = new Intent(OptionsMenuActivity.this, SecondActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;

    case R.id.menu_umbrella:
        setMenuItemIconState(currentMenu, MyApplication.getSelectedMenuItemDrawIcon(), true);
        MyApplication.setSelectedMenuItemDrawIcon(R.drawable.umbrella_active);
        intent = new Intent(OptionsMenuActivity.this, ThirdActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        return true;

    default:
        return super.onOptionsItemSelected(item);
    }
}

private void setMenuItemIconState(Menu menu, int menuItemIconRes, boolean switchLastActiveMenuItemIcon) {
    int menuItemId = 0;
    int lastDeActiveDrawIcon = 0;
    switch (menuItemIconRes) {
        case R.drawable.phone_active:
            menuItemId = R.id.menu_first;
            lastDeActiveDrawIcon = R.drawable.phone;
            break;
        case R.drawable.butterfly_active:
            menuItemId = R.id.menu_second;
            lastDeActiveDrawIcon = R.drawable.butterfly;
            break;
        case R.drawable.umbrella_active:
            menuItemId = R.id.menu_third;
            lastDeActiveDrawIcon = R.drawable.umbrella;
            break;
    }
    if (switchLastActiveMenuItemIcon) {
        MenuItem menuItem = menu.findItem(menuItemId);
        menuItem.setIcon(lastDeActiveDrawIcon);
        return;
    }
    MenuItem menuItem = menu.findItem(menuItemId);
    menuItem.setIcon(MyApplication.getSelectedMenuItemDrawIcon());
 }
}

In MyApplication.java I have only a getter and a setter of selectedMenuItemDrawIcon.I managed to set the icons properly, but failed with the others.

Is it possible to customize options menu like that? If not, is there any other approaches for creating an xml file and make it appear and disappear smoothly just like basic menu of android.

Any help would be appreciated. Thanks in advance, (please provide with code example).

boburShox
  • 2,630
  • 5
  • 23
  • 35

0 Answers0