Introduction:
‘Android.View.ActionMode’ is an Android API that is used to set up contextual actionbar with the help of xml. When an app enables this action mode by selecting an item, a contextual action bar is displayed at the header of the page. Here, users are enabled to perform on the currently chosen item.
The contextual action bar disappears when the user selects other action icon (in this case ‘delete’ icon), or selects the ‘Done’ action on the left side of the action bar.
Note: The contextual action bar works independently and overtakes the action bar position.
Steps to create a contextual action bar with the delete action:
1. In the main activity, implement the ‘ActionMode.Callback’ interface and override all implemented methods as per application requirements:
- public boolean onActionItemClicked(ActionMode mode, MenuItem item)
- public boolean onCreateActionMode(ActionMode mode, Menu menu)
- public void onDestroyActionMode(ActionMode arg0)
- public boolean onPrepareActionMode(ActionMode arg0, Menu arg1)
2. For selecting list item, implement the ‘setOnItemLongClickListener’ method on ‘ListView ‘object and call ‘this.startActionMode()’ to start ‘actionmode’ by passing ‘ActionMode.Callback’ object.
Example of Main-Activity:
package com.example.contextualactionbardemo; import java.util.ArrayList; import android.os.Bundle; import android.app.AlertDialog; import android.app.ListActivity; import android.content.DialogInterface; import android.util.Log; import android.view.ActionMode; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.AdapterView.OnItemLongClickListener; public class MainActivity extends ListActivity { protected Object mActionMode; private static int selectedItem = -1; private ArrayList list; private String listItem = ""; private ArrayAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView listView = (ListView) findViewById(R.id.listview); String[] values = new String[] { "Android List Item One", "Android List Item Two", "Android List Item Three", "Android List Item Four", "Android List Item Five", "Android List Item Six", "Android List Item Seven", "Android List Item Eight" }; list = new ArrayList(); for (int i = 0; i < values.length; ++i) { list.add(values[i]); } adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, list); setListAdapter(adapter); listView = getListView(); listView.setOnItemLongClickListener(new OnItemLongClickListener() { public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int pos, long id) { Log.v("long clicked","pos"+" "+pos); if (mActionMode != null) { return false; } selectedItem = -1; selectedItem = pos; listItem = list.get(selectedItem); mActionMode = MainActivity.this.startActionMode(mActionModeCallback); arg1.setSelected(true); return true; } }); } private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() { @Override public boolean onActionItemClicked(ActionMode mode, MenuItem item) { switch (item.getItemId()) { case R.id.action_delete: AlertDialog.Builder alertDialog = new AlertDialog.Builder(MainActivity.this); // Setting Dialog Title alertDialog.setTitle("Confirm Delete..."); // Setting Dialog Message alertDialog.setMessage("Are you sure you want to delete?"); alertDialog.setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog,int which) { adapter.remove(listItem); adapter.notifyDataSetChanged(); } }); // Setting Negative "NO" Button alertDialog.setNegativeButton("NO", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.cancel(); } }); // Showing Alert Message alertDialog.show(); mode.finish(); return true; default: return false; } } @Override public boolean onCreateActionMode(ActionMode mode, Menu menu) { mode.setTitle(listItem); MenuInflater inflater = mode.getMenuInflater(); inflater.inflate(R.menu.deletemenu, menu); return true; } @Override public void onDestroyActionMode(ActionMode arg0) { // TODO Auto-generated method stub mActionMode = null; selectedItem = -1; } @Override public boolean onPrepareActionMode(ActionMode arg0, Menu arg1) { // TODO Auto-generated method stub return false; } }; }
Example of /res/menu/deletemenu.xml:
Conclusion:
Contextual action mode is useful in following cases:
- To show customize menu display with icon of edit, rename, delete
- To display dynamic customize menu over the action bar
Have something to add to this topic? Share it in the comments.