目录
[Android ContextMenu 上下文菜单](#Android ContextMenu 上下文菜单)
[Android SubMenu 子菜单](#Android SubMenu 子菜单)
[Android PopupMenu 弹出菜单](#Android PopupMenu 弹出菜单)
Android ContextMenu 上下文菜单
在Android开发中,ContextMenu(上下文菜单)为用户提供了一种简便的方式来执行对特定组件的操作。例如,长按列表中的一个项目时,可能会出现一个菜单,让用户选择"编辑"、"删除"等操作。
ContextMenu
Android提供了一种非常简单的方式来创建和处理上下文菜单(ContextMenu),主要通过在Activity中重写几个关键方法来实现。
这种方式不依赖于XML布局文件或是直接实例化某个类,而是通过与Activity生命周期紧密相关的几个回调方法来管理。
- registerForContextMenu(View view)
- 说明:这个方法用于为特定的View注册上下文菜单。当用户长按该View时,就会触发上下文菜单的显示。
- 使用场景:通常在Activity的onCreate()方法中调用此方法,为想要显示上下文菜单的View注册。
- onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
- 说明:当注册了上下文菜单的View被长按时,这个方法会被调用。在这里,你可以定义上下文菜单的内容,比如菜单项。
- 使用场景:需要重写这个方法来填充上下文菜单,例如添加菜单项。
- onContextItemSelected(MenuItem item)
- 说明:用户选择上下文菜单中的某个项时,这个方法会被触发。在这里,你可以处理用户的点击事件。
- 使用场景:需要重写这个方法来响应用户对上下文菜单项的选择。
调用顺序和流程
- 注册上下文菜单:在onCreate()方法中,通过调用registerForContextMenu(view)为特定的View注册上下文菜单。
- 创建上下文菜单:当用户长按已注册的View时,会自动调用onCreateContextMenu(menu, v, menuInfo)方法,在这里定义上下文菜单的内容。
- 响应菜单项点击:用户点击上下文菜单中的某个项时,onContextItemSelected(MenuItem item)方法会被调用,在这里处理点击事件。
范例
1、修改 activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
2、修改 MainActivity.java
java
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
ListView listView;
String[] items = {"Java", "C#", "Python", "Ruby", "PHP", "C++", "Go", "Swift", "Kotlin", "JavaScript"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listview);
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, items);
listView.setAdapter(adapter);
// 注册 Context Menu
registerForContextMenu(listView);
}
// 创建 Context Menu
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.context_menu, menu);
}
// 处理 Context Menu 项点击事件
@Override
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int itemId = item.getItemId();
if (itemId == R.id.action_edit) {
Toast.makeText(this, "编辑 " + items[info.position], Toast.LENGTH_SHORT).show();
return true;
} else if (itemId == R.id.action_delete) {
Toast.makeText(this, "删去 " + items[info.position], Toast.LENGTH_SHORT).show();
return true;
} else {
return super.onContextItemSelected(item);
}
}
}
3、在res/menu目录下创建一个名为context_menu.xml的文件(如果没有menu目录,则需要创建它)。
XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_edit"
android:title="编辑"/>
<item
android:id="@+id/action_delete"
android:title="删去"/>
</menu>
参考文档
Android SubMenu 子菜单
在Android开发中,SubMenu(子菜单)是一种常用的UI组件,允许在一个主菜单项下创建一个二级菜单。这对于分类和组织复杂的菜单项非常有用,可以帮助用户更好地导航应用的功能。(子菜单不是单独存在的,而是在 OptionMenu 或者 ContextMenu 中可以添加子菜单)
范例
1、创建菜单资源文件
首先,需要在res/menu目录下创建一个XML文件来定义菜单项,比如main_menu.xml。
XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<!-- checkableBehavior 的可选值由三个:single设置为单选,all为多选,none为普通选项 -->
<group android:checkableBehavior="none">
<item android:id="@+id/create"
android:title="新建" />
<item android:id="@+id/edit"
android:title="编辑" />
</group>
<item android:id="@+id/saveall"
android:title="子菜单" >
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/save"
android:title="保存" />
<item android:id="@+id/save_as"
android:title="另存为..." />
<item
android:id="@+id/save_all"
android:title="保存全部" />
</menu>
</item>
<item android:id="@+id/help"
android:title="帮助" />
</menu>
2、修改 activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:id="@+id/btn_pop"
android:text="长按我弹出上下文菜单"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
3、修改 MainActivity.java
java
package com.example.myapplication;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button btnPop = findViewById(R.id.btn_pop);
registerForContextMenu(btnPop);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.main_menu, menu);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
int itemId = item.getItemId();
if (itemId == R.id.create) {
// 处理新建操作
return true;
} else if (itemId == R.id.edit) {
// 处理编辑操作
return true;
} else if (itemId == R.id.save) {
// 处理保存操作
return true;
} else if (itemId == R.id.save_as) {
// 处理另存为操作
return true;
} else if (itemId == R.id.save_all) {
// 处理保存全部操作
return true;
} else if (itemId == R.id.help) {
// 处理帮助操作
return true;
} else {
return super.onContextItemSelected(item);
}
}
}
参考文档
Android PopupMenu 弹出菜单
在Android开发中,PopupMenu是一个非常有用的组件,它可以在用户界面的任何位置显示一个弹出菜单。这个菜单可以通过编程方式动态创建,也可以从XML菜单资源文件加载。
PopupMenu在Android中是一个用于显示上下文菜单的非常方便的组件,它可以附着在指定的视图(View)上。PopupMenu有几种构造方法允许你根据需要选择不同的参数来创建弹出菜单。以下是如何使用这些构造方法以及如何设置和显示PopupMenu的具体步骤:
- 基本构造方法:PopupMenu(Context context, View anchor): 这是最基本的构造函数,只需要上下文(通常是Activity)和锚点视图(即触发弹出菜单的视图)。
- 指定重力的构造方法:PopupMenu(Context context, View anchor, int gravity): 这个构造函数除了上下文和锚点视图外,还允许你指定弹出菜单的重力(gravity),例如Gravity.END,控制菜单显示的位置相对于锚点视图。
- 完全自定义样式的构造方法:PopupMenu(Context context, View anchor, int gravity, int popupStyleAttr, int popupStyleRes): 这是最灵活的构造函数,它除了上述参数外,还允许你通过popupStyleAttr和popupStyleRes指定弹出菜单的样式。
范例
步骤1: 创建菜单资源文件
首先,在res/menu目录下创建一个名为main_menu.xml的菜单资源文件。
XML
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/action_item1"
android:title="选项 1"/>
<item
android:id="@+id/action_item2"
android:title="选项 2"/>
<item
android:id="@+id/action_item3"
android:title="选项 3"/>
</menu>
步骤2: 修改 activity_main.xml
XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:gravity="center"
tools:context=".MainActivity">
<Button
android:id="@+id/button_show_popup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="显示弹出菜单"
android:layout_centerInParent="true"/>
</LinearLayout>
步骤3: 修改 MainActivity.java
java
package com.example.myapplication;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.PopupMenu;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button buttonShowPopup = findViewById(R.id.button_show_popup);
buttonShowPopup.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 创建PopupMenu实例
PopupMenu popupMenu = new PopupMenu(MainActivity.this, v, Gravity.RIGHT);
// 从XML资源文件中填充菜单项
popupMenu.getMenuInflater().inflate(R.menu.main_menu, popupMenu.getMenu());
// 设置菜单项点击事件
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
Toast.makeText(MainActivity.this, "选中了: " + item.getTitle(), Toast.LENGTH_SHORT).show();
return true;
}
});
// 显示PopupMenu
popupMenu.show();
}
});
}
}