1 在Activity中创建菜单
- 在
Activity
中重写两个方法
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
- 创建资源文件
在res
目录下创建menu
目录,用来存放menu
相关file
创建资源文件menu_done
每个item必须创建id
<menu 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">
<item
android:id="@+id/menu_area"
android:orderInCategory="100"//数值越大级别越小,可设置来排位置
android:title="@string/choice_area"//文字
app:showAsAction="always" />//显示方式
<item
android:id="@+id/menu_icon"
android:icon="@mipmap/icon_down"//当icon和title一起使用时,显示图标
android:orderInCategory="100"
android:title="@string/choice_area"
app:showAsAction="always" />
</menu>
- app:showAsAction=”” 的含义
always
任何情况都在toolbar
显示
ifRoom
当·toolbar·空间足够时,显示,不足时隐藏
never
任何情况 不在toolbar
上显示,点击在右上角的”更多”才能看见
withText
图文(title+icon)显示
collapseActionView
隐藏不直接显示
menuCategory
:同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。 - 在Activity中加载资源文件
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//load the file of menu that you created
getMenuInflater().inflate(R.menu.menu_done, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_area) {
//TODO do everything what you want
return true;
} else {
return super.onOptionsItemSelected(item);
}
}
2 在Fragment中创建菜单
在fragment
中创建menu
菜单步骤和在activity
中创建步骤一致,也有差别
- 重写的方法
//此方法与activity的有所不同
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return super.onOptionsItemSelected(item);
}
- 创建
menu
资源同activity中一致 - 加载资源文件
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_area, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_area || id == R.id.menu_icon) {
//TODO 选择区域
item.setTitle("海淀区");
return true;
} else
return super.onOptionsItemSelected(item);
}
当这样写完了去奔跑起来的时候,你会发现想要的根本没有出现,接下来。。。。
- 干货来了
在fragment
的onCreate()
方法中添加关键代码,允许添加
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* 在fragment创建menu关键方法
*/
setHasOptionsMenu(true);
}
- 写在最后的话
在上面的资源文件中定义了2个菜单项,一个显示文字在左侧,另一个显示的图标在文字右侧 - 想要实现的效果是无论点击哪一个都去改变左侧文字
- 实现方案
//在此方法中将要操作的MenuItem定义为全局变量
MenuItem item1;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_area, menu);
item1 = menu.findItem(R.id.menu_area);
super.onCreateOptionsMenu(menu, inflater);
}
//在此方法中通过查找id,以此来确定响应事件
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.menu_area || id == R.id.menu_icon) {
//TODO 选择区域
item.setTitle("海淀区");//这种实际上是操纵2个菜单项
item1.setTitle("改变了");//只操作所想的,perfect
return true;
} else
return super.onOptionsItemSelected(item);
}
如果您有更好的实现方法或是有更完善的,请给我留言更新,跪谢3分钟…
持续更新中…