Putting a menu item in the ActionBar - Android Honeycomb

With my usual apology of late that I don't have much time for writing these days, if you're working with Android Honeycomb (3.2) or newer, and want to put a menu item in the ActionBar (Action Bar) for an Activity, I hope this source code will help.

To put a menu item in the Action Bar, you'll need to edit these files:

  • The Java source code for your Activity (MainActivity.java in my case)
  • Create a menu file (mainmenu.xml)
  • Your Android manifest

For more advanced purposes you may need to edit other files, but for one basic menu item in the ActionBar, that's all you need.

The app activity: MainActivity.java

Here's the source code for my main Java Activity class. I've put some documentation in the source code.

package com.devdaily.fptrackerlite;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity 
extends Activity
{
  private Menu theMenu = null;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    theMenu = menu;
    // reference to /res/menu/mainmenu.xml
    new MenuInflater(getApplication()).inflate(R.menu.mainmenu, menu);
    return (super.onCreateOptionsMenu(menu));
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  
    // code to handle the menu item tap
    if (item.getItemId() == R.id.calc) {
      Toast.makeText(this, "Got your tap", Toast.LENGTH_LONG).show();
      return true;
    }

  // this is how you handle the home button tap (not really needed for this example)
    if (item.getItemId() == android.R.id.home) {
      Toast.makeText(this, "Got menu item tap", Toast.LENGTH_LONG).show();
      return true;
    }

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

The menu: mainmenu.xml

Next, here's what /res/menu/mainmenu.xml looks like:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/calc"
    android:title="Calc"
    android:orderInCategory="1"
    android:showAsAction="always"/>
</menu>

That creates a menu item without an icon. If you prefer an icon, use this instead:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:id="@+id/close"
    android:title="Calc"
    android:orderInCategory="3"
    android:icon="@drawable/calc" 
    android:showAsAction="always"/>
</menu>

For this second example you'll need a file named calc.png in /res/drawable.

Android manifest

To get the menu working in the ActionBar, I think you also have to specify a minSdkVersion ... I'm not sure of the exact version, but since I'm targeting Honeycomb (which is Android v3.2, and therefore minSdkVersion 13), I specify minSdkVersion = 13 here.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.devdaily.fptrackerlite"
  android:versionCode="1"
  android:versionName="1.0" >

  <uses-sdk android:minSdkVersion="13" android:targetSdkVersion="13" />

  <application
    android:icon="@drawable/icon"
    android:label="@string/app_name" >

    <activity
      android:name=".MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>

  </application>

</manifest>

That's all you need to get a menu item going in the Android Honeycomb ActionBar, but I'll share the XML view file for my Activity here as well.

The view: main.xml

Here's what the view file for my Activity looks like. Note there are no references to the menu.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  android:gravity="top"
  android:orientation="vertical" >

  <LinearLayout
    android:id="@+id/linearLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <TextView
      android:id="@+id/ilfMainLabel"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="@string/ilf_main_label"
      android:textAppearance="?android:attr/textAppearanceLarge" />

  </LinearLayout>

  <EditText
    android:id="@+id/ilfsTextArea"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:cursorVisible="true"
    android:inputType="textMultiLine"
    android:singleLine="false"
    android:typeface="monospace"
    android:gravity="top|left" 
    >

    <requestFocus />
  </EditText>

</LinearLayout>

Also, here's /res/values/strings.xml file:

<?xml version="1.0" encoding="utf-8"?>
<resources>

  <string name="app_name">FPTrackerLite</string>
  <string name="ilf_main_label">Add ILFs (one per line)</string>

</resources>

Summary

In summary, I think that's all you need to get a menu item displaying and working in the Action Bar of Android 3.2 and newer.

Post new comment

The content of this field is kept private and will not be shown publicly.