作者:Otway
版權(quán):轉(zhuǎn)載請(qǐng)注明出處!
選項(xiàng)菜單 OptionMenu
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@[+][package:]id/resource_name"
android:title="string"
android:titleCondensed="string"
android:icon="@[package:]drawable/drawable_resource_name"
android:onClick="method name"
android:showAsAction=["ifRoom" | "never" | "withText" | "always" | "collapseActionView"]
android:actionLayout="@[package:]layout/layout_resource_name"
android:actionViewClass="class name"
android:actionProviderClass="class name"
android:alphabeticShortcut="string"
android:alphabeticModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"]
android:numericShortcut="string"
android:numericModifiers=["META" | "CTRL" | "ALT" | "SHIFT" | "SYM" | "FUNCTION"]
android:checkable=["true" | "false"]
android:visible=["true" | "false"]
android:enabled=["true" | "false"]
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
android:orderInCategory="integer" />
<group android:id="@[+][package:]id/resource name"
android:checkableBehavior=["none" | "all" | "single"]
android:visible=["true" | "false"]
android:enabled=["true" | "false"]
android:menuCategory=["container" | "system" | "secondary" | "alternative"]
android:orderInCategory="integer" >
<item />
</group>
<item >
<menu>
<item />
</menu>
</item>
</menu>
-
android:showAsAction
-
ifRoom
: Only place this item in the app bar if there is room for it -
never
: overflow menu -
withText
: only textandroid:title
-
always
: on the bar -
collapseActionView
:android:actionLayout
orandroid:actionViewClass
-
-
android:actionViewClass
<item android:id="@+id/action_search" android:title="@string/action_search" android:icon="@drawable/ic_search" app:showAsAction="ifRoom|collapseActionView" app:actionViewClass="android.support.v7.widget.SearchView" />
通過(guò)
setOnActionExpandListener()
監(jiān)聽(tīng)展開(kāi)收縮事件
android:actionViewLayout
引入布局用于操作窗口王污,效果類似于android:actionViewClass
-
android:actionProviderClass
<item android:id="@+id/action_share" android:title="share" app:showAsAction="always" app:actionProviderClass="android.support.v7.widget.ShareActionProvider" />
顯示布局及可以監(jiān)聽(tīng)相關(guān)事件
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); MenuItem shareItem = menu.findItem(R.id.action_share); if (searchItem != null) { mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); if (!setShareIntent()){ menu.removeItem(R.id.action_share); //沒(méi)有第三方可以分享,可以自定義 //如果一個(gè)應(yīng)用程序需要接受Share Intent發(fā)送的共享數(shù)據(jù)棒妨, // 那么需要在該應(yīng)用程序的Manifest.xml文件中定義<intent-filter/>元素 //android.intent.action.SEND, // 指明應(yīng)用組件想要接受的intent } } return super.onCreateOptionsMenu(menu); }
// Call to update the share intent private boolean setShareIntent() { if (mShareActionProvider != null) { Intent shareIntent = new Intent(Intent.ACTION_SEND); shareIntent.setType("text/plain"); shareIntent.putExtra(Intent.EXTRA_TEXT, "share content");//EXTRA_STREAM PackageManager pm = getPackageManager(); //檢查手機(jī)上是否存在可以處理這個(gè)動(dòng)作的應(yīng)用 List<ResolveInfo> infoList = pm.queryIntentActivities(shareIntent, 0); if (!infoList.isEmpty()) { mShareActionProvider.setShareIntent(shareIntent); return true; } return false; } return false; }
這種會(huì)記錄偏好含长,可通過(guò)
setShareHistoryFileName()
設(shè)置記錄的xml文件名設(shè)置
setOnShareTargetSelectedListener
監(jiān)聽(tīng)條目點(diǎn)擊事件可繼承
support
包下ActionProvider
自定義實(shí)現(xiàn)
android.support.design.R.dimen.abc_action_bar_default_height_material
關(guān)于overflow menu在高版本不顯示icon
安卓4.0之前會(huì)顯示icon券腔,高版本中不會(huì)顯示,可以通過(guò)反射去設(shè)置icon的顯示
private void setIconEnable(Menu menu, boolean enable) {
if (menu != null) {
try {
Class clazz = menu.getClass();
if (clazz.getSimpleName().equals("MenuBuilder")) {
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", Boolean.TYPE);
m.setAccessible(true);
//MenuBuilder實(shí)現(xiàn)Menu接口拘泞,創(chuàng)建菜單時(shí)纷纫,傳進(jìn)來(lái)的menu其實(shí)就是MenuBuilder對(duì)象
m.invoke(menu, enable);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* android 4.0以后使用AppCompatActivity必須在該方法中調(diào)用setIconEnable(),
* 隱藏的menuitem的icon才會(huì)顯示
* android 4.0以后其他的activity可以再onPrepreOptionMenu()中調(diào)用
* android 4.0以前可以正常顯示overflow中的menuitem的icon
* @param view
* @param menu
* @return
*/
@Override
protected boolean onPrepareOptionsPanel(View view, Menu menu) {
setIconEnable(menu, true);//讓在overflow中的menuitem的icon顯示
return super.onPrepareOptionsPanel(view, menu);
}
手機(jī)實(shí)體菜單按鍵導(dǎo)致actionbar上的三個(gè)點(diǎn)圖標(biāo)不顯示
/**
* 通過(guò)反射陪腌,設(shè)置實(shí)體menu鍵可用與否
* 該方法在onCreate()中調(diào)用
* @param enable false:實(shí)體鍵不可用辱魁,會(huì)在actionbar上顯示小點(diǎn)
* true:可用,點(diǎn)擊menu實(shí)體鍵才會(huì)顯示menuitem
*/
public void setHasPermanentMenuKey(boolean enable){
try {
ViewConfiguration mconfig = ViewConfiguration.get(this);
Field menuKeyField = ViewConfiguration.class.getDeclaredField("sHasPermanentMenuKey");
if(menuKeyField != null) {
menuKeyField.setAccessible(true);
menuKeyField.setBoolean(mconfig, enable);
}
} catch (Exception ex) {
}
}
可以通過(guò)自定義toolbar中布局實(shí)現(xiàn)理想效果
ActionBar actionBar = getSupportActionBar();
//設(shè)置自定義actionbar的view
actionBar.setCustomView(R.layout.action_bar_layout);
//設(shè)置展示的options為DISPLAY_SHOW_CUSTOM
actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
//設(shè)置showCustom為true
actionBar.setDisplayShowCustomEnabled(true);
上下文菜單 ContextMenu
浮動(dòng)上下文菜單
registerForContextMenu(View view)
注冊(cè)于上下文菜單關(guān)聯(lián)的View-
Activity 或 Fragment實(shí)現(xiàn)
registerForContextMenu()
诗鸭,當(dāng)關(guān)聯(lián)的View收到長(zhǎng)按事件之后染簇,會(huì)響應(yīng)該方法。@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); }
-
事件監(jiān)聽(tīng)
@Override public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { //TODO default: return super.onContextItemSelected(item); } }
為單個(gè)視圖啟用上下文操作模式
- 實(shí)現(xiàn) ActionMode.Callback 接口强岸。在其回調(diào)方法中锻弓,您既可以為上下文操作欄指定操作,又可以響應(yīng)操作項(xiàng)目的點(diǎn)擊事件蝌箍,還可以處理操作模式的其他生命周期事件
- 當(dāng)需要顯示操作欄時(shí)青灼,調(diào)用
activity
的startActionMode()
方法
彈出菜單 PopupMenu
public void showPopup(View v) {
PopupMenu popup = new PopupMenu(this, v);
MenuInflater inflater = popup.getMenuInflater();
inflater.inflate(R.menu.actions, popup.getMenu());
popup.show();
}
通過(guò)setOnMenuItemclickListener()
設(shè)置監(jiān)聽(tīng)
基于 Intent 的菜單項(xiàng)
通過(guò)intent_filter定義刪選規(guī)則 CATEGORY_ALTERNATIVE
和 CATEGORY_SELECTED_ALTERNATIVE
調(diào)用Menu.addIntentOptions()
來(lái)添加應(yīng)用列表
ListPopupMenu
final ListPopupWindow popup = new ListPopupWindow(mContext);
List<String> list = new ArrayList<>();
list.add("不喜歡");
list.add("舉報(bào)");
popup.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
popup.setAdapter(new ArrayAdapter<>(mContext, R.layout.biz_elevator_layout_note_popup_item, list));
popup.setWidth( mContext.getResources().getDimensionPixelSize(R.dimen.width40));
popup.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popup.setAnchorView(mUserLayout);
popup.setModal(true);
popup.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
switch (position) {
case 0:
break;
case 1:
break;
}
popup.dismiss();
}
});
popup.setHorizontalOffset(-40);
popup.setDropDownGravity(Gravity.END);
popup.show();
PopupWindow
final PopupWindow popupWindow = new PopupWindow(mContext);
View inflate = LayoutInflater.from(mContext).inflate(R.layout.biz_elevator_layout_note_item_popup, null);
View tvDislike = inflate.findViewById(R.id.popup_dislike);
View tvReport = inflate.findViewById(R.id.popup_report);
tvDislike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback != null) {
mCallback.onDisLikeClicked(v, mPosition);
}
popupWindow.dismiss();
}
});
tvReport.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mCallback != null) {
mCallback.onReportClicked(v, mPosition);
}
popupWindow.dismiss();
}
});
popupWindow.setContentView(inflate);
popupWindow.setWidth(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);
popupWindow.setBackgroundDrawable(new ColorDrawable(Color.WHITE));
// this setting can intercept the touch event when popupWindow opened
popupWindow.setFocusable(true);
popupWindow.setTouchable(true);
popupWindow.setOutsideTouchable(true);
PopupWindowCompat.showAsDropDown(popupWindow, v, -50, 10, Gravity.LEFT);