Cdacians

Cdacians
Cdacians

Sunday 21 April 2013

Android Context Menus


Android Context Menus

  • Share
Context menus are invoked in android when user performs a long click ( click and hold). While theOptions menu is associated with a specific activity, context menus are associated with specific views within the activity. Thus an activity can have only one options menu but many context menus.

Context Menu Creation

To create a context menu, you need to:
  • Register the view element to use a Context menu using the registerForContextMenu (View v)
  • Override the onCreateContextMenu ()method.  The method takes 3 arguments:
    • A default ContextMenu object,
    • The view element for which the context menu is desired and
    • A ContextMenuInfo object that can be used to pass any additional information that can used for  creation of the Context Menu.

Responding to Context menu Selections

To respond to context menus override the onContextItemSelected ()  method . The menu item that was selected is passed in as a argument to this method.

Example

Lets look at the context menu usage with a simple example.  In this example we have an activity with two TextView elements,  one with the context menu and the other without. The context menu lets us choose the background color of the TextView element as shown in the  sample screenshot below.
Android Context Menu Demo

Context Menu Definition

Menus are also resources in android. To define a menu create a file called “color_menu.xml” and place it under res/menu folder.  As shown below, you define the menu inside the menu tag and populate the menu items using the item tag. You need to specify a valid id for each menu item. This is used to respond to menu item selections as shown later below.
?
1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
    <item android:id="@+id/menu_red" android:title="Red" />
    <item android:id="@+id/menu_green" android:title="Green"/>
    <item android:id="@+id/menu_blue" android:title="Blue"/>
</menu>

Activity Layout Definition

The activity layout is simple and consists of a linear layout with two TextView elements within it as shown.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent">
 
    <TextView android:id="@+id/context_color"
              android:layout_height="wrap_content"
              android:layout_width="fill_parent"
              android:gravity="center"
              android:layout_margin="5dip"
              android:textColor="@color/DarkGrey"
              android:text="Color Context Menu ( Click and Hold)"
            />
 
    <TextView android:id="@+id/menuDemoDiv1"
                 android:layout_height="1dip"
                 android:layout_width="match_parent"
                 android:background="@color/white"
                 android:textColor="@color/DarkGrey"
                 android:text=""/>
 
    <TextView android:id="@+id/menu_textView2"
                  android:layout_height="wrap_content"
                  android:layout_width="fill_parent"
                  android:gravity="center"
                  android:layout_margin="5dip"
                  android:textColor="@color/DarkGrey"
                  android:text="TextView with no context Menu"
                />
</LinearLayout>

Java Source Code

  • Register the first TextView element to use the ContextMenu within the onCreate() method of the activity
  • Override the onCreateContextMenu() method to create the context menu. The general pattern is to use the id of the view element to generate different menus.  In this case we delegate the menu creation to a private helper method. This method uses the MenuInflater instance available to the activity to inflate the color menu defined as a xml resource. Just as with layout files, android automatically generate unique ids for the menu resources based on the name of the file which is then passed into the getMenuInflater (). inflate ()method.
  • You can respond to the menu selections by switching on the id of  the MenuItem being passed as argument to the onContextItemSelected () method. In this case we change the background color of the TextView element based on the selection.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
public class MenuDemo extends Activity {
   private TextView m_contextColor;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.menudemo);
      m_contextColor = (TextView) findViewById(R.id.context_color);
      /**
       * Register the View elements in the activity to generate
       * Context menus
       */
      registerForContextMenu(m_contextColor);
   }
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v,
                            ContextMenu.ContextMenuInfo menuInfo) {
       switch (v.getId()) {
          case R.id.context_color:
             createMenu(R.menu.color_menu, menu, "Choose a color");
             break;
          default:
             super.onCreateContextMenu(menu, v, menuInfo);
       }
    }
   private void createMenu(int menuID, ContextMenu menu,
                                            String title) {
      /**
       * Use a MenuInflater associated with the activity to
       * inflate the Menu layout
       */
      getMenuInflater().inflate(menuID, menu);
      menu.setHeaderTitle(title);
   }
 
   @Override
   public boolean onContextItemSelected(MenuItem item) {
      switch (item.getItemId()) {
         case R.id.menu_red:
            m_contextColor.setBackgroundResource(R.color.LightRed);
            return true;
         case R.id.menu_blue:
            m_contextColor.setBackgroundResource(R.color.DullBlue);
            return true;
         case R.id.menu_green:
            m_contextColor.setBackgroundResource(R.color.LightGreen);
            return true;
         default:
            return super.onContextItemSelected(item);
      }
   }
}

Happy Coding !!!
akm
cdacians

No comments:

Post a Comment