menus

    xiaoxiao2025-07-29  4

    menu 基本可以分分成下面三类。Options menu and app bar/Context menu and contextual action mode/Popup menu. 可以在xml中定义menu,下面是个实例 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android">     <item android:id="@+id/new_game"           android:icon="@drawable/ic_new_game"           android:title="@string/new_game"           android:showAsAction="ifRoom"/>     <item android:id="@+id/help"           android:icon="@drawable/ic_help"           android:title="@string/help" /> </menu> menu标签可以嵌套,这样就是子menu. 在xml中定义的menu,在Activity中可以通过menuInflater.inflate()来展开. Creating an Options Menu 需要重写Activity的onCreateOptionsMenu()方法。 @Override public boolean onCreateOptionsMenu(Menu menu) {     MenuInflater inflater = getMenuInflater();     inflater.inflate(R.menu.game_menu, menu);     return true; } 可以通过add()函数来添加新的menu,通过findItem()找到menu item后在,再来修改. 当用户选择option menu中的一个item时,系统会调用Activity的onOptionsItemSelected()方法,这个函数的形参是被选中的MenuItem。这个时候就可以通过调用getItemId()方法来找到被选中的item. @Override public boolean onOptionsItemSelected(MenuItem item) {     // Handle item selection     switch (item.getItemId()) {         case R.id.new_game:             newGame();             return true;         case R.id.help:             showHelp();             return true;         default:             return super.onOptionsItemSelected(item);     } } 当成功处理被选中的item时,就返回true,如果不能处理就调用父类onOptionsItemSelected()方法,就如上例中的default的处理. Creating Contextual Menus 可以通过floating context menu 或者 contextual action mode方法来创建上下文菜单. 先来看看如何创建floating context menu。 首先调用registerForContextMenu来关联view. 85        final ListView list = (ListView) findViewById(R.id.list); 86        list.setAdapter(adapter); 87 88        registerForContextMenu(list); 其次实现onCreateContextMenu()方法. @Override public void onCreateContextMenu(ContextMenu menu, View v,                                 ContextMenuInfo menuInfo) {     super.onCreateContextMenu(menu, v, menuInfo);     MenuInflater inflater = getMenuInflater();     inflater.inflate(R.menu.context_menu, menu); } 再实现onContextItemSelected()方法来处理没有item按下的操作. @Override public boolean onContextItemSelected(MenuItem item) {     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();     switch (item.getItemId()) {         case R.id.edit:             editNote(info.id);             return true;         case R.id.delete:             deleteNote(info.id);             return true;         default:             return super.onContextItemSelected(item);     } } 再来看看contextual action mode的实现. 如果你仅仅想在用户选择特定view的时候调用contextual action mode,你可以参考下面的步奏。 实现 ActionMode.Callback 方法. private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {     // Called when the action mode is created; startActionMode() was called     @Override     public boolean onCreateActionMode(ActionMode mode, Menu menu) {         // Inflate a menu resource providing context menu items         MenuInflater inflater = mode.getMenuInflater();         inflater.inflate(R.menu.context_menu, menu);         return true;     }     // Called each time the action mode is shown. Always called after onCreateActionMode, but     // may be called multiple times if the mode is invalidated.     @Override     public boolean onPrepareActionMode(ActionMode mode, Menu menu) {         return false; // Return false if nothing is done     }     // Called when the user selects a contextual menu item     @Override     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {         switch (item.getItemId()) {             case R.id.menu_share:                 shareCurrentItem();                 mode.finish(); // Action picked, so close the CAB                 return true;             default:                 return false;         }     }     // Called when the user exits the action mode     @Override     public void onDestroyActionMode(ActionMode mode) {         mActionMode = null;     } }; 这些操作就和option menu是一样的。 调用startActionMode方法来使能contextual action mode someView.setOnLongClickListener(new View.OnLongClickListener() {     // Called when the user long-clicks on someView     public boolean onLongClick(View view) {         if (mActionMode != null) {             return false;         }         // Start the CAB using the ActionMode.Callback defined above         mActionMode = getActivity().startActionMode(mActionModeCallback);         view.setSelected(true);         return true;     } }); 当你的item是通过ListView或者GridView显示的,你想让用户可以处理批操作。你可以参考下面的步奏. 实现AbsListView.MultiChoiceModeListener,调用setMultiChoiceModeListener 设定这个Listenr ListView listView = getListView(); listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); listView.setMultiChoiceModeListener(new MultiChoiceModeListener() {     @Override     public void onItemCheckedStateChanged(ActionMode mode, int position,                                           long id, boolean checked) {         // Here you can do something when items are selected/de-selected,         // such as update the title in the CAB     }     @Override     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {         // Respond to clicks on the actions in the CAB         switch (item.getItemId()) {             case R.id.menu_delete:                 deleteSelectedItems();                 mode.finish(); // Action picked, so close the CAB                 return true;             default:                 return false;         }     }     @Override     public boolean onCreateActionMode(ActionMode mode, Menu menu) {         // Inflate the menu for the CAB         MenuInflater inflater = mode.getMenuInflater();         inflater.inflate(R.menu.context, menu);         return true;     }     @Override     public void onDestroyActionMode(ActionMode mode) {         // Here you can make any necessary updates to the activity when         // the CAB is removed. By default, selected items are deselected/unchecked.     }     @Override     public boolean onPrepareActionMode(ActionMode mode, Menu menu) {         // Here you can perform updates to the CAB due to         // an invalidate() request         return false;     } }); 调用 setChoiceMode() 设定CHOICE_MODE_MULTIPLE_MODAL Creating a Popup Menu 可以在xml中定义popup menu 在item的回调验证中,new一个popupmenu,最后调用popup.show()方法来显示. public void showPopup(View v) {     PopupMenu popup = new PopupMenu(this, v);     MenuInflater inflater = popup.getMenuInflater();     inflater.inflate(R.menu.actions, popup.getMenu());     popup.show(); } 调用setOnMenuItemClickListener 开响应用户点击的item。你必须实现 onMenuItemClick() 方法,如下所示: public void showMenu(View v) {     PopupMenu popup = new PopupMenu(this, v);     // This activity implements OnMenuItemClickListener     popup.setOnMenuItemClickListener(this);     popup.inflate(R.menu.actions);     popup.show(); } @Override public boolean onMenuItemClick(MenuItem item) {     switch (item.getItemId()) {         case R.id.archive:             archive(item);             return true;         case R.id.delete:             delete(item);             return true;         default:             return false;     } } Creating Menu Groups 可以在xml中通过group标签来添加menu group。 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android">     <item android:id="@+id/menu_save"           android:icon="@drawable/menu_save"           android:title="@string/menu_save" />     <!-- menu group -->     <group android:id="@+id/group_delete">         <item android:id="@+id/menu_archive"               android:title="@string/menu_archive" />         <item android:id="@+id/menu_delete"               android:title="@string/menu_delete" />     </group> </menu> 可以通过android:checkableBehavior 设置checkbox属性. public boolean onOptionsItemSelected(MenuItem item) {     switch (item.getItemId()) {         case R.id.vibrate:         case R.id.dont_vibrate:             if (item.isChecked()) item.setChecked(false);             else item.setChecked(true);             return true;         default:             return super.onOptionsItemSelected(item);     } } 需要实现onOptionsItemSelected 方法,来响应用户的操作. Adding Menu Items Based on an Intent 首先在manifest中声明intent-filter <intent-filter label="@string/resize_image">     ...     <category android:name="android.intent.category.ALTERNATIVE" />     <category android:name="android.intent.category.SELECTED_ALTERNATIVE" />     ... </intent-filter> 其次建立intent如下所示: public boolean onCreateOptionsMenu(Menu menu){     super.onCreateOptionsMenu(menu);     // Create an Intent that describes the requirements to fulfill, to be included     // in our menu. The offering app must include a category value of Intent.CATEGORY_ALTERNATIVE.     Intent intent = new Intent(null, dataUri);     intent.addCategory(Intent.CATEGORY_ALTERNATIVE);     // Search and populate the menu with acceptable offering applications.     menu.addIntentOptions(          R.id.intent_group,  // Menu group to which new items will be added          0,      // Unique item ID (none)          0,      // Order for the items (none)          this.getComponentName(),   // The current activity name          null,   // Specific items to place first (none)          intent, // Intent created above that describes our requirements          0,      // Additional flags to control items (none)          null);  // Array of MenuItems that correlate to specific items (none)     return true; }
    转载请注明原文地址: https://ju.6miu.com/read-1301188.html
    最新回复(0)