记录一下我写菜单的代码,我写了一共有三种菜单,从常用到不常用。
目录
去往三个不同菜单的按钮
package com.example.menutext;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void toOptionMenu(View view) {
Intent intent=new Intent(this,OptionMenuActivity.class);
startActivity(intent);
}
public void toContextMenu(View view) {
Intent intent=new Intent(this,ContextMenuActivity.class);
startActivity(intent);
}
public void toEjectMenu(View view) {
Intent intent=new Intent(this,EjectMenuActivity.class);
startActivity(intent);
}
}
(1)选项菜单
需要
1.Menu的XML文件
首先Menu的XML文件有几个图标就有几个item,showAsAction是让图标显示在Toolbar上还是不显示在上面。
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_local"
android:title="定位"
android:icon="@drawable/local"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_like"
android:title="喜欢"
android:icon="@drawable/like"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_share"
android:title="分享"
android:icon="@drawable/share"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_report"
android:title="举报"
android:icon="@drawable/report"
app:showAsAction="ifRoom"/>
</menu>
2.Java自定义Adapter代码
接下来,我还设置了一下导航栏的title以及返回图标。getSupportActionbar()方法是获取当前Activity的导航栏并返回一个对象,通过对象去设置里面的信息。
里面有两个回调方法,onCreateOptionsMenu()方法是创建一个菜单
onOptionsItemSelected()方法是对菜单里的图标进行操作,获取每个图标的id等于获取了每个菜单里的图标的信息。
package com.example.menutext;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Toast;
public class OptionMenuActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_option_menu);
//获取导航栏
ActionBar actionBar = getSupportActionBar();
actionBar.setTitle("选项菜单");
//设置返回图标
actionBar.setDisplayHomeAsUpEnabled(true);
}
//创建菜单
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//绑定menu菜单和xml文件
MenuInflater menuInflater = getMenuInflater();
menuInflater.inflate(R.menu.menu_option,menu);
return super.onCreateOptionsMenu(menu);
}
//对菜单操作
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
int itemId = item.getItemId();
Toast.makeText(this, item.getTitle()
,Toast.LENGTH_SHORT).show();
switch (itemId){
case R.id.menu_like:
return true;
case R.id.menu_local:
return true;
case R.id.menu_share:
return true;
//对返回图标进行操作
// case android.R.id.home:
// this.finish();
// break;
default:
break;
}
return false;
}
}
最后看看效果
(2)上下文菜单(用了ArrayAdapter适配器)
1.Menu的XML文件
这里图个方便,menu文件都用一样的吧,就是上面已经贴出来了再贴一次吧,懒得让你们翻了
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_local"
android:title="定位"
android:icon="@drawable/local"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_like"
android:title="喜欢"
android:icon="@drawable/like"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_share"
android:title="分享"
android:icon="@drawable/share"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_report"
android:title="举报"
android:icon="@drawable/report"
app:showAsAction="ifRoom"/>
</menu>
2.Layout文件主代码
然后是Layout文件主代码,挺简单的
<?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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".ContextMenuActivity">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button"
android:layout_gravity="center_horizontal"/>
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
3.Java主代码
然后就是Java主代码
package com.example.menutext;
import androidx.annotation.NonNull;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
public class ContextMenuActivity extends AppCompatActivity {
Button btn;
ListView listView;
String[] strings={"1","22","33","55","88","yuyu","huhu","momo"
,"33","55","88","yuyu","huhu","momo"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_context_menu);
//获取组件
btn = findViewById(R.id.button);
listView= findViewById(R.id.lv);
//上下文菜单和其他两个菜单不一样的是控件要想显示菜单必须注册
registerForContextMenu(btn);
registerForContextMenu(listView);
//获取导航栏(和菜单无关)
ActionBar supportActionBar = getSupportActionBar();
supportActionBar.setTitle("上下文菜单");
supportActionBar.setDisplayHomeAsUpEnabled(true);
//设置适配器
listView.setAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,strings));
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
//获取menu的xml文件
MenuInflater menuInflater = getMenuInflater();
//xml文件和此方法绑定,才会被创建
menuInflater.inflate(R.menu.menu_option,menu);
}
@Override
public boolean onContextItemSelected(@NonNull MenuItem item) {
//此处是点击ListView中的item中的信息,对Button用会报错
// AdapterView.AdapterContextMenuInfo menuInfo =
// (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
// Toast.makeText(this, item.getTitle().toString()
// +menuInfo.position, Toast.LENGTH_SHORT).show();
//此处是点击Button,对ListView中的item没用
int id = item.getItemId();
Toast.makeText(this, item.getTitle(), Toast.LENGTH_SHORT).show();
return super.onContextItemSelected(item);
}
}
最后有效果图
(3)弹出式菜单
1.Menu的XML文件
和上面两个都是一样的,看的方便
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/menu_local"
android:title="定位"
android:icon="@drawable/local"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_like"
android:title="喜欢"
android:icon="@drawable/like"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_share"
android:title="分享"
android:icon="@drawable/share"
app:showAsAction="ifRoom"/>
<item android:id="@+id/menu_report"
android:title="举报"
android:icon="@drawable/report"
app:showAsAction="ifRoom"/>
</menu>
2.Layout主布局
点击一下按钮就会弹出菜单,和上下文菜单不同的是上下文菜单要长按才能显示出来
<?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:orientation="vertical"
android:layout_height="match_parent"
tools:context=".EjectMenuActivity">
<Button
android:id="@+id/btn_popup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="BU"
android:onClick="popup" />
</LinearLayout>
3.Java主代码
而且弹出式菜单直接new出一个对象设置属性就可以了,比前面两个容易理解,也比较方便,但就是用的比较少,popupMenu的构造函数里面的参数意思是,第一个是上下文,第二个直接把形参view传进去即可,第三个参数是弹出式菜单从鼠标左边弹出来还是右边,我感觉右边比较好(还有一个中间的,但是没啥用好像),其他挺简单的就不注释了hh
package com.example.menutext;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.PopupMenu;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class EjectMenuActivity extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_eject_menu);
btn = findViewById(R.id.btn_popup);
ActionBar supportActionBar = getSupportActionBar();
supportActionBar.setTitle("弹出式菜单");
supportActionBar.setDisplayHomeAsUpEnabled(true);
}
public void popup(View view) {
PopupMenu popupMenu=new PopupMenu(this,view, Gravity.RIGHT);
popupMenu.inflate(R.menu.menu_option);
popupMenu.show();
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
int itemId = item.getItemId();
Toast.makeText(EjectMenuActivity.this,item.getTitle(), Toast.LENGTH_SHORT).show();
return false;
}
});
}
}
最后上效果图