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.