运行环境
Android Studio 2020.3.1
文章目录
1. Menu组件
参考资料:>>传送门<<
Menu组件是管理菜单项目的一个interface接口,所以在使用时,重写方法就好。
任何Activity活动都支持设置响应或设置的菜单,可添加项目在菜单并且可以添加单击事件。
添加菜单项的最简单方法是通过Activity类,在类中重写方法 onOptionsSelected(MenuItem)
和 onContextItemSelected(MenuItem)
不同的菜单组件有着不同的功能。
Context Menus | Option Menus | Sub Menus | |
---|---|---|---|
快捷方式 | × | √ | √ |
项目图标 | × | √ | × |
嵌套子菜单 | √ | √ | × |
项目选择标记 | √ | × | √ |
1.1 Option Menus
参考资料:>> 传送门 <<
该组件通常配合一个独立的Menu菜单布局文件,它的最大特点是不支持选项标记。
如何实现该菜单?主要分为两步:1. 设置布局填充 ->2. 设置菜单项响应事件
显示一个菜单必然需要一个载体。
Step 1. 填充布局的方法 public boolean onCreateOptionsMenu (Menu menu)
(仅执行一次)
范例 :使用 menu_option.xml 填充菜单布局
menu_option.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_option_insert"
android:icon="@android:drawable/ic_input_add"
android:title="添加"
android:visible="true"
app:showAsAction="always" />
<item
android:id="@+id/menu_option_reset"
android:title="初始化" />
</menu>
MainActivity.java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_option, menu);
return super.onCreateOptionsMenu(menu);
}
Step 2. 菜单项单击时的响应方法 public boolean onOptionsItemSelected(@NonNull MenuItem item)
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.option1:
//...
break;
case R.id.option2:
//...
break;
}
return super.onOptionsItemSelected(item);
}
只需重写两个方法,就能实现右上角菜单。
1.2 Context Menus
该组件不支持快捷方式和项目图标,不过可以嵌套子菜单和项目的选项标记。
如何实现该菜单?分为三步:1. 绑定组件 -> 2. 填充布局 -> 3. 选项响应
不同于之前的Options Menu,它不会出现在主界面的右上角,所以需要有能使其出现的一个方式,比如单击按钮、长按列表框等。
Step 1. 绑定组件 registerForContextMenu(R.id.findViewById(R.id.listView));
Step 2. 填充布局 public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)
(每次都调用)
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
getMenuInflater().inflate(R.menu.menu_listview, menu);
}
Step 3. 选项响应 public boolean onContextItemSelected(@NonNull MenuItem item)
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
// 获取菜单点击项的序号
int pos = ((AdapterView.AdapterContextMenuInfo)
item.getMenuInfo()).position;
// 根据不同选项处理逻辑...
switch (item.getItemId()) {
case R.id.menu_insert:
break;
case R.id.menu_delete:
break;
}
return super.onContextItemSelected(item);
}
2. AlertDialog警告对话框
参考资料:>>传送门<<
观察上图,AltertDialog类实现了接口Dialoginterface
,这个接口的作用是在设置弹窗的响应事件,比如点击确认按钮后,主界面的组件发生相应的改变。
如何创建一个弹窗?通过AlertDialog.Builder()
对象
范例:创建并显示一个空弹窗
new AlertDialog.Builder(context).create().show()
设置一个弹窗的信息,通常是对Builder
对象使用set
方法,最后在调用其create()方法生成一个AlertDialog对象。
官方文档介绍了许多关于Builder类的set方法,在这里列举几个:
方法名 | 作用描述 |
---|---|
create() |
返回一个AlertDialog对象 |
setMultiChoiceItems() |
设置要在对话框中显示的项目列表作为内容。 |
setPositiveButton() |
设置确认按钮的标题和响应事件 |
setNegativeButton() |
设置取消按钮的标题和响应事件 |
setView() |
为对话框设置视图 |
3. Android 案例
示例:创建Menu的布局文件
创建Menu组件
2.1 实现右上角菜单
最终效果:
option_menu.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/option1"
android:title="选项1:Java" />
<item
android:id="@+id/option2"
android:title="选项2:Python"
/>
<item
android:id="@+id/option3"
android:title="选项3:C++"
/>
</menu>
layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
/>
</LinearLayout>
MainActivity.java
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_main);
tv = findViewById(R.id.textView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.option_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()){
case R.id.option1:
tv.setText("Java");
break;
case R.id.option2:
tv.setText("Python");
break;
case R.id.option3:
tv.setText("C++");
break;
}
return super.onOptionsItemSelected(item);
}
}
2.2 实现列表框菜单的增添和删除选项
最终效果:
menu_listview.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menu_insert"
android:title="添加随机项" />
<item
android:id="@+id/menu_delete"
android:title="删除" />
</menu>
layout_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/main_lv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity.java
import androidx.annotation.NonNull;
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 java.util.ArrayList;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
ArrayList<Str