Android menu options provide user with actions and other options to choose from the action bar of the screen. Some of these actions are common to all the activities for your application, so instead of creating them in each of your activities you can create a BaseActivity that extends the Activity class and does all your menu processing. Then you can extend then base activity class in your application activities to get the same menu options. In case you want a slightly customized menu option for one or more of your activities then override the onPrepareOptionsMenu method to manipulate the menu before its displayed on the screen. Here you can add/remove menu options to the existing menu before being displayed. Here is a simple example doing exactly what we just discussed.
Source for the common menu options - common_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu1" android:alphabeticShortcut="a"
android:title="Menu No. 1" android:orderInCategory="1" />
<item android:id="@+id/menu2" android:alphabeticShortcut="b"
android:title="Menu No. 2" android:orderInCategory="2">
<menu >
<group android:id="@+id/group2" android:checkableBehavior="single">
<item android:id="@+id/submenu1" android:title="SubMenu No. 1" />
<item android:id="@+id/submenu2" android:title="SubMenu No. 2" />
</group>
</menu>
</item>
</menu>
Source for the main activity layout - activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Main Activity"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<Button
android:id="@+id/nextActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="false"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"
android:text="Go to the next Activity" />
</RelativeLayout>
Source for the next activity layout - activity_next.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Another Activity"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<Button
android:id="@+id/goBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="false"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"
android:text="Go back to previous Activity" />
</RelativeLayout>
Source for the base activity - BaseActivity.java
package com.as400samplecode;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class BaseActivity extends Activity{
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.common_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu1:
Toast.makeText(this, "Clicked: Menu No. 1", Toast.LENGTH_SHORT).show();
return true;
case R.id.submenu1:
Toast.makeText(this, "Clicked: Menu No. 2 - SubMenu No .1", Toast.LENGTH_SHORT).show();
return true;
case R.id.submenu2:
Toast.makeText(this, "Clicked: Menu No. 2 - SubMenu No .2", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Source for the main activity - MainActivity.java
package com.as400samplecode;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends BaseActivity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button nextActivity = (Button) findViewById(R.id.nextActivity);
nextActivity.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.nextActivity:
Intent nextActivity = new Intent(this,NextActivity.class);
startActivity(nextActivity);
break;
}
}
}
Source for the next activity - NextActivity.java
package com.as400samplecode;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class NextActivity extends BaseActivity implements OnClickListener{
private static final int MENU3 = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
Button goBack = (Button) findViewById(R.id.goBack);
goBack.setOnClickListener(this);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem menu3 = menu.findItem(MENU3);
if(menu3 == null){
menu3 = menu.add(Menu.NONE, MENU3, 3, "Menu No. 3");
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MENU3:
Toast.makeText(this, "Clicked: Menu No. 3", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.goBack:
finish();
break;
}
}
}
Source for the common menu options - common_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/menu1" android:alphabeticShortcut="a"
android:title="Menu No. 1" android:orderInCategory="1" />
<item android:id="@+id/menu2" android:alphabeticShortcut="b"
android:title="Menu No. 2" android:orderInCategory="2">
<menu >
<group android:id="@+id/group2" android:checkableBehavior="single">
<item android:id="@+id/submenu1" android:title="SubMenu No. 1" />
<item android:id="@+id/submenu2" android:title="SubMenu No. 2" />
</group>
</menu>
</item>
</menu>
Source for the main activity layout - activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Main Activity"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<Button
android:id="@+id/nextActivity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="false"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"
android:text="Go to the next Activity" />
</RelativeLayout>
Source for the next activity layout - activity_next.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:text="Another Activity"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textStyle="bold" />
<Button
android:id="@+id/goBack"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="false"
android:layout_alignParentTop="false"
android:layout_below="@id/textView1"
android:layout_centerHorizontal="true"
android:text="Go back to previous Activity" />
</RelativeLayout>
Source for the base activity - BaseActivity.java
package com.as400samplecode;
import android.app.Activity;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class BaseActivity extends Activity{
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.common_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu1:
Toast.makeText(this, "Clicked: Menu No. 1", Toast.LENGTH_SHORT).show();
return true;
case R.id.submenu1:
Toast.makeText(this, "Clicked: Menu No. 2 - SubMenu No .1", Toast.LENGTH_SHORT).show();
return true;
case R.id.submenu2:
Toast.makeText(this, "Clicked: Menu No. 2 - SubMenu No .2", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
}
Source for the main activity - MainActivity.java
package com.as400samplecode;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends BaseActivity implements OnClickListener{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button nextActivity = (Button) findViewById(R.id.nextActivity);
nextActivity.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.nextActivity:
Intent nextActivity = new Intent(this,NextActivity.class);
startActivity(nextActivity);
break;
}
}
}
Source for the next activity - NextActivity.java
package com.as400samplecode;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class NextActivity extends BaseActivity implements OnClickListener{
private static final int MENU3 = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);
Button goBack = (Button) findViewById(R.id.goBack);
goBack.setOnClickListener(this);
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
MenuItem menu3 = menu.findItem(MENU3);
if(menu3 == null){
menu3 = menu.add(Menu.NONE, MENU3, 3, "Menu No. 3");
}
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
case MENU3:
Toast.makeText(this, "Clicked: Menu No. 3", Toast.LENGTH_SHORT).show();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.goBack:
finish();
break;
}
}
}
No comments:
Post a Comment