Android动态修改ToolBar的Menu菜单示例

作者:kqw攻城狮 时间:2021-10-29 15:36:07 

Android动态修改ToolBar的Menu菜单

效果图

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
0
投稿

猜你喜欢

  • Eclipse下基于Java的OpenCV开发环境配置教程

    2022-01-30 21:02:54
  • Java Comparable及Comparator接口区别详解

    2023-07-03 08:19:50
  • Android编程基于自定义View实现绚丽的圆形进度条功能示例

    2023-07-24 17:13:26
  • 浅谈一下SpringCloud中Hystrix服务熔断和降级原理

    2021-10-02 08:46:41
  • C#波形图控件制作示例程序

    2022-02-24 21:50:40
  • 简单讲解Java设计模式编程中的单一职责原则

    2022-05-02 03:09:24
  • 基于C#实现的木马程序实例详解

    2023-02-25 20:05:03
  • 对dbunit进行mybatis DAO层Excel单元测试(必看篇)

    2023-08-19 02:37:19
  • 详解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
  • Java线程通信中关于生产者与消费者案例分析

    2022-01-18 10:49:25
  • SpringBoot中定时任务@Scheduled注解的使用解读

    2022-11-24 17:20:11
  • JAVA抛出异常的三种形式详解

    2022-06-26 22:44:32
  • JAVA反射机制实例详解

    2021-11-08 13:39:34
  • Spring中IOC和AOP的深入讲解

    2023-11-19 10:20:59
  • 详解Spring Cloud中Hystrix的请求合并

    2022-07-06 14:53:06
  • Javaweb El表达式实例详解

    2021-06-21 22:59:32
  • 详解JDK自带javap命令反编译class文件和Jad反编译class文件(推荐使用jad)

    2021-12-24 00:29:29
  • SpringBoot security安全认证登录的实现方法

    2021-05-30 08:09:56
  • asp之家 软件编程 m.aspxhome.com