Android动态修改ToolBar的Menu菜单示例
作者:kqw攻城狮 时间:2021-10-29 15:36:07
Android动态修改ToolBar的Menu菜单
效果图
实现
实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,把对应的Action隐藏了。
开始上货
Menu
Menu下添加3个Item
<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"
tools:context="com.kongqw.myapplication.MainActivity">
<item
android:id="@+id/search_button"
android:icon="@mipmap/navigation_icon_search"
android:orderInCategory="100"
android:title="搜索"
app:showAsAction="ifRoom" />
<item
android:id="@+id/scan_button"
android:icon="@mipmap/navigation_icon_sweep"
android:orderInCategory="100"
android:title="扫描"
app:showAsAction="ifRoom" />
<item
android:id="@+id/setting_button"
android:icon="@mipmap/titlebar_icon_settings_normal"
android:orderInCategory="100"
android:title="设置"
app:showAsAction="ifRoom" />
</menu>
重写onPrepareOptionsMenu方法
用来根据ViewPager显示页面控制Menu显示的Item
Demo里我用的是ViewPager滑动来控制,可以根据自己需求,不过大多数都是判断ViewPager吧。
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// 动态设置ToolBar状态
switch (mViewPager.getCurrentItem()) {
case 0:
menu.findItem(R.id.search_button).setVisible(true);
menu.findItem(R.id.scan_button).setVisible(true);
menu.findItem(R.id.setting_button).setVisible(false);
break;
case 1:
menu.findItem(R.id.search_button).setVisible(false);
menu.findItem(R.id.scan_button).setVisible(false);
menu.findItem(R.id.setting_button).setVisible(false);
break;
case 2:
menu.findItem(R.id.search_button).setVisible(false);
menu.findItem(R.id.scan_button).setVisible(false);
menu.findItem(R.id.setting_button).setVisible(true);
break;
}
return super.onPrepareOptionsMenu(menu);
}
Item点击
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.search_button) {
Toast.makeText(getApplicationContext(), "搜索", Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.scan_button) {
Toast.makeText(getApplicationContext(), "扫描", Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.setting_button) {
Toast.makeText(getApplicationContext(), "设置", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
监听ViewPager滑动,改变Menu状态(重点)
调用invalidateOptionsMenu();方法从新加载Menu,即回调onPrepareOptionsMenu方法
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
invalidateOptionsMenu();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
Code(参考)
就是Android Studio默认创建的带有ViewPager的Demo,
package com.kongqw.myapplication;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private SectionsPagerAdapter mSectionsPagerAdapter;
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.container);
mViewPager.setAdapter(mSectionsPagerAdapter);
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
// getWindow().invalidatePanelMenu(Window.FEATURE_OPTIONS_PANEL);
invalidateOptionsMenu();
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// 动态设置ToolBar状态
switch (mViewPager.getCurrentItem()) {
case 0:
menu.findItem(R.id.search_button).setVisible(true);
menu.findItem(R.id.scan_button).setVisible(true);
menu.findItem(R.id.setting_button).setVisible(false);
break;
case 1:
menu.findItem(R.id.search_button).setVisible(false);
menu.findItem(R.id.scan_button).setVisible(false);
menu.findItem(R.id.setting_button).setVisible(false);
break;
case 2:
menu.findItem(R.id.search_button).setVisible(false);
menu.findItem(R.id.scan_button).setVisible(false);
menu.findItem(R.id.setting_button).setVisible(true);
break;
}
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.search_button) {
Toast.makeText(getApplicationContext(), "搜索", Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.scan_button) {
Toast.makeText(getApplicationContext(), "扫描", Toast.LENGTH_SHORT).show();
return true;
} else if (id == R.id.setting_button) {
Toast.makeText(getApplicationContext(), "设置", Toast.LENGTH_SHORT).show();
return true;
}
return super.onOptionsItemSelected(item);
}
public static class PlaceholderFragment extends Fragment {
private static final String ARG_SECTION_NUMBER = "section_number";
public PlaceholderFragment() {
}
public static PlaceholderFragment newInstance(int sectionNumber) {
PlaceholderFragment fragment = new PlaceholderFragment();
Bundle args = new Bundle();
args.putInt(ARG_SECTION_NUMBER, sectionNumber);
fragment.setArguments(args);
return fragment;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_main, container, false);
TextView textView = (TextView) rootView.findViewById(R.id.section_label);
textView.setText(getString(R.string.section_format, getArguments().getInt(ARG_SECTION_NUMBER)));
return rootView;
}
}
public class SectionsPagerAdapter extends FragmentPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return PlaceholderFragment.newInstance(position + 1);
}
@Override
public int getCount() {
return 3;
}
@Override
public CharSequence getPageTitle(int position) {
switch (position) {
case 0:
return "SECTION 1";
case 1:
return "SECTION 2";
case 2:
return "SECTION 3";
}
return null;
}
}
}
来源:http://blog.csdn.net/q4878802/article/details/51160424
标签:toolbar,android
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Eclipse下基于Java的OpenCV开发环境配置教程
2022-01-30 21:02:54
![](https://img.aspxhome.com/file/2023/4/82424_0s.png)
Java Comparable及Comparator接口区别详解
2023-07-03 08:19:50
![](https://img.aspxhome.com/file/2023/5/57425_0s.png)
Android编程基于自定义View实现绚丽的圆形进度条功能示例
2023-07-24 17:13:26
![](https://img.aspxhome.com/file/2023/7/84737_0s.png)
浅谈一下SpringCloud中Hystrix服务熔断和降级原理
2021-10-02 08:46:41
![](https://img.aspxhome.com/file/2023/6/129196_0s.jpg)
C#波形图控件制作示例程序
2022-02-24 21:50:40
![](https://img.aspxhome.com/file/2023/3/106443_0s.png)
简单讲解Java设计模式编程中的单一职责原则
2022-05-02 03:09:24
基于C#实现的木马程序实例详解
2023-02-25 20:05:03
对dbunit进行mybatis DAO层Excel单元测试(必看篇)
2023-08-19 02:37:19
![](https://img.aspxhome.com/file/2023/3/110853_0s.png)
详解EventBus 3.x 的快速使用
2021-09-04 21:00:29
java 读取本地文件实例详解
2023-08-12 20:41:32
maven项目install时忽略执行test方法的总结
2023-11-07 09:58:16
![](https://img.aspxhome.com/file/2023/5/77455_0s.jpg)
Java线程通信中关于生产者与消费者案例分析
2022-01-18 10:49:25
SpringBoot中定时任务@Scheduled注解的使用解读
2022-11-24 17:20:11
![](https://img.aspxhome.com/file/2023/9/62679_0s.png)
JAVA抛出异常的三种形式详解
2022-06-26 22:44:32
JAVA反射机制实例详解
2021-11-08 13:39:34
Spring中IOC和AOP的深入讲解
2023-11-19 10:20:59
![](https://img.aspxhome.com/file/2023/9/59529_0s.jpg)
详解Spring Cloud中Hystrix的请求合并
2022-07-06 14:53:06
![](https://img.aspxhome.com/file/2023/7/86867_0s.png)
Javaweb El表达式实例详解
2021-06-21 22:59:32
![](https://img.aspxhome.com/file/2023/8/94368_0s.png)
详解JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)
2021-12-24 00:29:29
![](https://img.aspxhome.com/file/2023/3/97803_0s.png)
SpringBoot security安全认证登录的实现方法
2021-05-30 08:09:56
![](https://img.aspxhome.com/file/2023/5/63685_0s.png)