2.1系统菜单: OptionsMenu
注意:一个Activity只有一个系统菜单
步骤流程:
- 在res下面创建一个menu文件夹,并新建一个xml文件作为OptionMenu的布局文件
- Activity重写onCreateOptionsMenu(Menu menu) 加载资源文件
a) 设置menu填充器: getMenuInflater().inflate(R.menu.xml , menu); - Activity重写onOptionsItemSelected(MenuItem item) 加设置事件监听
a) 获得点击的条目: int item_id = item.getItemId();
b) switch 判断
2.2上下文菜单ContextMenu
注意:长按绑定的控件+可以为任意一个view设置上下文菜单
步骤流程:
- 在res下面创建一个menu文件夹,并新建一个xml文件作为ContextMenu的布局文件
- Activity重写onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 加载资源文件
a) 设置menu填充器: getMenuInflater().inflate(R.menu.xml , menu); - Activity重写onConextItemSelected(MenuItem item) 加设置事件监听
a) 获得点击的条目: int item_id = item.getItemId();
b) switch 判断 - 为控件添加长按属性 并将菜单绑定到这个控件上
a) registerForContextMenu(textView); //为textView 注册上下文菜单
2.3弹出菜单PoupMenu
注意:弹出菜单,默认弹出的位置在控件view的下方
步骤流程:
- 在res下面创建一个menu文件夹,并新建一个xml文件作为PoupMenu的布局文件
- 把PopupMenu相关逻辑封装到showPopupMenu()方法中, 包含PopupMenu的实例化、布局设置、显示、添加MenuItem的点击监听及响应等
a) 给View视图设置点击事件, 并调用showPopupMenu()方法
b) 封装showPopupMenu()方法
i. 创建对象
PopupMenu popupMenu = new PopupMenu(上下文, View视图);
ii. 利用用填充器, 填充布局
popupMenu.inflate(R.menu.xml);
iii. 事件监听
popupMenu.setOnMenuItemClickListener()
iv. 显示
popupmenu.show(); - 为控件设置事件监听直接调用showPopupMenu()方法
总代码如下:
- 主布局 : activity_main.xml下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
tools:context=".MainActivity">
<TextView
android:id="@+id/textView_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="系统菜单演示"
android:textSize="18sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</RelativeLayout>
- res下面创建一个menu文件夹,并新建一个xml文件: options_menu文件
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<!--showAsAction属性: always总是; never 从不; ifRoom 能显示就显示; 默认是nerver-->
<item
android:id="@+id/blue"
android:title="蓝色"
app:showAsAction="never"></item>
<item
android:id="@+id/red"
android:title="红色"></item>
<item
android:id="@+id/green"
android:title="绿色"></item>
</menu>
- MainActivity中
package com.example.app2;
import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private RelativeLayout relativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textView_id);
relativeLayout = findViewById(R.id.layout_id);
// 上下文菜单ContextMenu
// 为控件添加长按属性并将菜单绑定到这个控件上
// register: 注册;
registerForContextMenu(textView);
// 弹出菜单PoupMenu
//点击事件 PopupMenu
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
showPopupMenu();
}
});
}
/**
* 弹出菜单设置
*/
private void showPopupMenu() {
// 1. 创建对象
// 参1 上下文; 参二: 菜单显示在指定控件的下方
PopupMenu popupMenu = new PopupMenu(this, textView);
// 2. 记载布局 填充布局
popupMenu.inflate(R.menu.options_menu);
// 3. 事件监听
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case R.id.blue:
// 注意: 颜色不能使用缩写 如: #00f
// 否则报java.lang.IllegalArgumentException: Unknown color异常
textView.setTextColor(Color.parseColor("#0000ff")); //设置文本的颜色
break;
case R.id.green:
textView.setTextColor(Color.parseColor("#00ff00")); //设置文本的颜色
break;
case R.id.red:
textView.setTextColor(Color.parseColor("#ff0000")); //设置文本的颜色
break;
default:
break;
}
return false;
}
});
// 4. 显示
popupMenu.show();
}
// 系统菜单: OptionsMenu
// 重写onCreateOptionsMenu 加载资源文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// menu 填充器
getMenuInflater().inflate(R.menu.options_menu, menu);
return super.onCreateOptionsMenu(menu);
}
// 系统菜单: OptionsMenu
// 重写onOptionsItemSelected 设置事件监听
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case R.id.blue:
// 注意: 颜色不能使用缩写 如: #00f
// 否则报java.lang.IllegalArgumentException: Unknown color异常
// textView.setTextColor(Color.parseColor("#0000ff")); //设置文本的颜色
relativeLayout.setBackgroundColor(Color.parseColor("#0000ff")); //设置背景颜色
break;
case R.id.green:
// textView.setTextColor(Color.parseColor("#00ff00")); //设置文本的颜色
relativeLayout.setBackgroundColor(Color.parseColor("#00ff00")); //设置背景颜色
break;
case R.id.red:
// textView.setTextColor(Color.parseColor("#ff0000")); //设置文本的颜色
relativeLayout.setBackgroundColor(Color.parseColor("#ff0000")); //设置背景颜色
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
// 上下文菜单ContextMenu
//2.Activity重写onCreateContextMenu加载资源文件
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
getMenuInflater().inflate(R.menu.options_menu, menu);
super.onCreateContextMenu(menu, v, menuInfo);
}
// 上下文菜单ContextMenu
// 3.Activity重写onConextItemSelected设置事件监听
@Override
public boolean onContextItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch (itemId) {
case R.id.blue:
// 注意: 颜色不能使用缩写 如: #00f
// 否则报java.lang.IllegalArgumentException: Unknown color异常
textView.setTextColor(Color.parseColor("#0000ff")); //设置文本的颜色
break;
case R.id.green:
textView.setTextColor(Color.parseColor("#00ff00")); //设置文本的颜色
break;
case R.id.red:
textView.setTextColor(Color.parseColor("#ff0000")); //设置文本的颜色
break;
default:
break;
}
return super.onContextItemSelected(item);
}
}