第一章 menu概述
1.选项菜单
2.上下文菜单
3.弹出菜单
第二章 menu的使用
1.创建menu文件https://developer.android.com/guide/topics/resources/menu-resource
第一节 Option菜单操作
使用画布进行操作
MenuInflater 详细讲解
此类用于将菜单XML文件实例化为Menu对象。
MenuInflater(Context context)
inflate(int menuRes, Menu menu)
从指定的XML资源中膨胀菜单层次结构。
<menu>
定义 Menu,即菜单项的容器。<menu> 元素必须是该文件的根节点,并且能够包含一个或多个 <item> 和 <group> 元素。
<item>
创建 MenuItem,此元素表示菜单中的一项,可能包含嵌套的 <menu> 元素,以便创建子菜单。
<group>
<item> 元素的不可见容器(可选)。它支持您对菜单项进行分类,使其共享活动状态和可见性等属性。如需了解详细信息,请参阅创建菜单组部分。
1.使用java 代码创建Option菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
此外,您还可以使用 add()
添加菜单项,并使用 findItem()
检索项目,以便使用 MenuItem
API 修改其属性。
2.处理点击事件
@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);
}
}
3.在运行时更改菜单项
如需根据在 Activity 生命周期中发生的事件修改选项菜单,则可通过 onPrepareOptionsMenu()
方法执行此操作。此方法向您传递 Menu
对象(因为该对象目前存在),以便您能够对其进行修改,如添加、移除或停用项目。(此外,片段还提供 onPrepareOptionsMenu()
回调。)
经常用到的菜单选项
图标与文本
Optionmenu菜单项选中方法
第二节 上下文菜单 ContextMenu
1.通过调用 registerForContextMenu(),注册应与上下文菜单关联的 View 并将其传递给 View。 如果 Activity 使用 ListView 或 GridView 且您希望每个项目均提供相同的上下文菜单,请通过将 ListView 或 GridView 传递给 registerForContextMenu(),为上下文菜单注册所有项目。
2.在 Activity 或 Fragment 中实现 onCreateContextMenu() 方法。 当注册后的视图收到长按事件时,系统将调用您的 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);
}
3.实现 onContextItemSelected()
当用户选择菜单的时候,系统将调用次方法 ,一遍能够进行适当地操作
getItemId()
方法将查询所选菜单项的 ID,您应使用 android:id
属性将此 ID 分配给 XML 中的每个菜单项(如使用 XML 定义菜单部分所示)。
4.补充
如果用户选择特定的视图进行上下文操作模式
1.实现actionMode.Callback 接口 ,在回调方法汇总,您可以为上下文操作使用相关的操作.
2.当需要显示操作栏时候,请调用startActionMode
5.toast
https://developer.android.com/reference/android/widget/Toast
1.基本功能
Context context = getApplicationContext();
CharSequence text = "Hello toast!";
int duration = Toast.LENGTH_SHORT;
Toast.makeText(context, text, duration).show();
//Toast toast = Toast.makeText(context, text, duration);
三个参数:应用 Context、文字消息和消息框时长。
//toast.show();
2.放置消息框
toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);
3.创建自定义消息框视图
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/custom_toast_container"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="8dp"
android:background="#DAAA"
>
<ImageView android:src="@drawable/droid"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
/>
<TextView android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#FFF"
/>
</LinearLayout>
4.java 设置
LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.custom_toast,
(ViewGroup) findViewById(R.id.custom_toast_container));
TextView text = (TextView) layout.findViewById(R.id.text);
text.setText("This is a custom toast");
Toast toast = new Toast(getApplicationContext());
toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
toast.setDuration(Toast.LENGTH_LONG);
toast.setView(layout);
toast.show();
首先,使用 getLayoutInflater()
(或 getSystemService()
)检索 LayoutInflater
,然后使用 inflate(int, ViewGroup)
扩充 XML 中的布局。第一个参数是布局资源 ID,第二个参数是根视图。您可以使用此扩充后的布局在布局中查找更多 View 对象,因此现在可以捕获并定义 ImageView 和 TextView 元素的内容。最后,使用 Toast(Context)
创建一个新消息框,并设置消息框的一些属性(例如重心和时长)。接着再调用 setView(View)
并向其传递扩充后的布局。现在,您可以通过调用 show()
使用自定义布局显示消息框。
6.Gravity
作用 :用于将对象放置在可能更大的容器中的标准常量和工具。
https://developer.android.com/reference/android/view/Gravity
7.实例代码
1.基础上下文菜单代码实现
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.*;
import android.widget.AdapterView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View viewContext = findViewById(R.id.buttoncontext);
// 1.注册点击事件
registerForContextMenu(viewContext);
}
//创建上下文菜单
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
//实现 onContextItemSelected()
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
Context context = getApplicationContext();
CharSequence[] text = {"Hello toast!", "Delete!"};
int duration = Toast.LENGTH_SHORT;
Toast toast1 = Toast.makeText(context, text[0], duration);
Toast toast2 = Toast.makeText(context, text[1], duration);
switch (item.getItemId()) {
case R.id.edit:
editNote(toast1);
return true;
case R.id.delete:
deleteNote(toast2);
return true;
default:
return super.onContextItemSelected(item);
}
}
//onContextItemSelected 方法
private void deleteNote(Toast info) {
info.show();
}
private void editNote(Toast info) {
info.show();
}
}
2.上下文操作模式
再次之前,我们先学习几个个API
public final Activity getActivity () 返回此片段当前与之关联的活动。
startActionMode(ActionMode.Callback callback, int type)
启动给定类型的操作模式。
ActionMode表示用户界面的上下文模式。动作模式可用于提供替代的交互模式,并替换普通UI的某些部分,直到完成为止。良好动作模式的示例包括文本选择和上下文动作。
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.*;
import android.widget.AdapterView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ActionMode actionMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View viewContext = findViewById(R.id.buttoncontext);
//1.注册点击事件
viewContext.setOnLongClickListener(new View.OnLongClickListener() {
// Called when the user long-clicks on someView
public boolean onLongClick(View view) {
if (actionMode != null) {
return false;
}
// Start the CAB using the ActionMode.Callback defined above
actionMode = startActionMode(actionModeCallback);
view.setSelected(true);
return true;
}
});
}
//onContextItemSelected 方法
private void deleteNote(Toast info) {
info.show();
}
private void editNote(Toast info) {
info.show();
}
//actionMode的回调函数
private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {
// Called when the action mode is created; startActionMode() was called
//当action mode 被创建的时候,startActionMode()被创建
@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
// 如果该模式无效,可能会多次调用。
//每次当action mode 被展示的时候调用,
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false; // Return false if nothing is done
}
// 当用户选择上下文菜单项时调用
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
Context context = getApplicationContext();
CharSequence[] text = {"Hello toast!", "Delete!"};
int duration = Toast.LENGTH_SHORT;
Toast toast1 = Toast.makeText(context, text[0], duration);
Toast toast2 = Toast.makeText(context, text[1], duration);
switch (item.getItemId()) {
case R.id.edit:
editNote(toast1);
return true;
case R.id.delete:
deleteNote(toast2);
return true;
default:
return false;
}
}
// 用户退出操作模式时调用
@Override
public void onDestroyActionMode(ActionMode mode) {
actionMode = null;
}
};
}
还有一种就是
这可能是在fragment中
第三种 Popupmenu
- 实例化
PopupMenu
及其构造函数,该函数将提取当前应用的Context
以及应锚定菜单的View
。 - 使用
MenuInflater
将菜单资源扩充到PopupMenu.getMenu()
返回的Menu
对象中。 - 调用
PopupMenu.show()
。
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_overflow_holo_dark"
android:contentDescription="@string/descr_overflow_button"
android:onClick="showPopup" />
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;
}
}
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.ActionMode;
import android.view.*;
import android.widget.AdapterView;
import android.widget.PopupMenu;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private ActionMode actionMode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
View pop = findViewById(R.id.pop);
pop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showMenu(v);
}
});
}
//创建显示菜单,
// 1.实例化
// 2.选择相应侦听器
// 3.加载资源
// 4.展示
public void showMenu(View v) {
PopupMenu popup = new PopupMenu(this, v);
// This activity implements OnMenuItemClickListener
popup.setOnMenuItemClickListener(listener);
popup.inflate(R.menu.actions);
popup.show();
}
//侦听器
PopupMenu.OnMenuItemClickListener listener = new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
CharSequence[] message = {"delete", "other"};
switch (item.getItemId()) {
case R.id.delete:
getToast(message[0]);
return true;
case R.id.other:
getToast(message[1]);
return true;
default:
return false;
}
}
};
//打印相应的字幕
public Toast getToast(CharSequence message) {
Context context = getApplicationContext( );
CharSequence text = message;
int duration = Toast.LENGTH_SHORT;
Toast toast = Toast.makeText(context, text, duration);
toast.show();
return toast;
}
}
第三章 常见问题与经验分析
1.动态生成
使用java代码
如果是静态就使用XML
动静结合
java 的动静结合非常的灵活,MVC 模式, 当我们需要使用到XML的时候,