標籤:android menu contextmenu
android中的操作功能表類似於PC上的滑鼠右鍵單擊,不同的是android上沒有滑鼠這一概念,更談不上按右鍵,在android中,一般是長按某個View,調出操作功能表。與OptionsMenu不同的是,ContextMenu是一個針對View的菜單,它綁定在某一個View上,而OptionsMenu是屬於一個Activity的。
現在大部分瀏覽器都有長按複製的功能,如:
這種效果的實現是使用PopupWindow來實現的(關於PopupWindow的使用可以參見我的另一篇文章popupWindow使用詳解
),雖然它和我們即將要說的ContextMenu很像。
好了,說了這麼多,我們該說說怎麼實現操作功能表了。
實現操作功能表一共三個步驟:
1.重寫Activity或者Fragment中的onCreateContextMenu方法:
@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);menu.setHeaderTitle("你想幹啥?");menu.setHeaderIcon(R.drawable.a4c);menu.add(0, 0, Menu.NONE, "複製");menu.add(0, 1, Menu.NONE, "剪貼");menu.add(0, 2, Menu.NONE, "重新命名");menu.add(1, 3, Menu.NONE, "去新的Activity");}
2.重寫Activity或者Fragment中的onContextItemSelected方法,實現菜單事件監聽
@Overridepublic boolean onContextItemSelected(MenuItem item) {switch (item.getItemId()) {case 0:tv.setText(item.getTitle().toString());break;case 1:tv.setText(item.getTitle().toString());break;case 2:tv.setText(item.getTitle().toString());break;case 3:tv.setText(item.getTitle().toString());startActivity(new Intent(this, SecondActivity.class));break;default:return super.onContextItemSelected(item);}return true;}
3.給View註冊操作功能表
tv = (TextView) this.findViewById(R.id.tv);this.registerForContextMenu(tv);
三個步驟實現了給一個TextView註冊了操作功能表事件,有時候我們會遇到另外情況,比如說要給ListView中的每一項都添加操作功能表,而且當我們長按ListView該項的時候,我們還希望能夠知道我們點擊的是哪一個item,這個該怎麼實現呢?AdapterContextMenuInfo專為解決這個問題而生,看看先下面的代碼:
public class SecondActivity extends Activity {private ListView lv;private String[] menuStrs;private ArrayAdapter<String> adapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);lv = (ListView) this.findViewById(R.id.lv);initListView();this.registerForContextMenu(lv);}private void initListView() {menuStrs = new String[] { "慶曆四年春", "滕子京謫守巴陵郡", "越明年", "政通人和" };adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, menuStrs);lv.setAdapter(adapter);}@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);menu.setHeaderTitle("你想幹啥?");menu.setHeaderIcon(R.drawable.a4c);menu.add(0, 0, Menu.NONE, "嶽");menu.add(0, 1, Menu.NONE, "陽");menu.add(0, 2, Menu.NONE, "樓");menu.add(1, 3, Menu.NONE, "記");}@Overridepublic boolean onContextItemSelected(MenuItem item) {AdapterContextMenuInfo menuInfo = (AdapterContextMenuInfo) item.getMenuInfo();switch (item.getItemId()) {case 0:menuStrs[menuInfo.position] += "嶽";break;case 1:menuStrs[menuInfo.position] += "陽";break;case 2:menuStrs[menuInfo.position] += "樓";break;case 3:menuStrs[menuInfo.position] += "記";break;default:return super.onContextItemSelected(item);}adapter.notifyDataSetChanged();return true;}}
前面的東西都很簡單,我就不多說了,通過AdapterContextMenuInfo的執行個體我們可以拿到我們所點擊item的position,id等,我們這裡實現的一個效果就是點擊操作功能表之後在每個item View後面添加一個字。
實現的效果如所示:
Demo下載https://github.com/lenve/contextMenu
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。若有錯誤地方,還望批評指正,不勝感激。
android開發之使用操作功能表