Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu

简介: Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menuAndroid早期推出的ActionBarActivity被Android谷歌官方废弃,推荐使用AppCompatActivity替代ActionBarActivity。


Android AppCompatActivity的ActionBar之SearchView、ShareActionProvider以及menu

Android早期推出的ActionBarActivity被Android谷歌官方废弃,推荐使用AppCompatActivity替代ActionBarActivity。在实际的开发中现在也基本上不再怎么使用ActionBar,而是使用最新的Toolbar替代ActionBar了,但是ActionBar也有其自身比较有特点的地方,比如ActionBar自身对SearchView,ShareActionProvider的良好支持,使得ActionBar在某些应用开发场景中依然有其用武之地。
现在给出一个例子说明如何在一个ActionBar中实现SearchView和ShareActionProvider。
先把完整的代码实现给出,然后结合代码加以说明。
测试用的主Activity,MainActivity.java:

package zhangphil.toolbar;

import android.content.Intent;
import android.os.Bundle;
import android.support.v4.view.MenuItemCompat;
import android.support.v4.view.MenuItemCompat.OnActionExpandListener;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.SearchView.OnQueryTextListener;
import android.support.v7.widget.ShareActionProvider;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		ActionBar ab = this.getSupportActionBar();
		ab.setDisplayHomeAsUpEnabled(true);
	}

	private Intent getMyIntent() {
		Intent intent = new Intent(Intent.ACTION_SEND);
		intent.setType("text/plain");
		intent.putExtra(Intent.EXTRA_SUBJECT, "主题");
		intent.putExtra(Intent.EXTRA_TEXT, "我的文字内容,zhangphil text");
		return intent;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.main, menu);

		MenuItem searchItem = menu.findItem(R.id.search);
		SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem);
		searchView.setOnQueryTextListener(new OnQueryTextListener() {
			@Override
			public boolean onQueryTextChange(String queryText) {
				Toast.makeText(getApplicationContext(), "onQueryTextChange:" + queryText, Toast.LENGTH_SHORT).show();
				return true;
			}

			@Override
			public boolean onQueryTextSubmit(String queryText) {
				Toast.makeText(getApplicationContext(), "onQueryTextSubmit:" + queryText, Toast.LENGTH_SHORT).show();
				return true;
			}
		});

		OnActionExpandListener expandListener = new OnActionExpandListener() {
			@Override
			public boolean onMenuItemActionCollapse(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionCollapse", Toast.LENGTH_SHORT).show();
				return true;
			}

			@Override
			public boolean onMenuItemActionExpand(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
				return true;
			}
		};

		MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);

		MenuItem shareItem = menu.findItem(R.id.share);
		ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
		shareActionProvider.setShareIntent(getMyIntent());

		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {

		case R.id.share:
			Toast.makeText(getApplicationContext(), "分享", Toast.LENGTH_SHORT).show();
			return true;

		case R.id.setting:
			Toast.makeText(getApplicationContext(), "设置", Toast.LENGTH_SHORT).show();
			return true;

		case R.id.about:
			Toast.makeText(getApplicationContext(), "关于", Toast.LENGTH_SHORT).show();
			return true;

		default:
			return super.onOptionsItemSelected(item);
		}
	}
}


在本例中,MainActivity.java不依赖任何布局文件,只是需要加载menu菜单,所以需要在res/menu/目录下写一个menu菜单的XML文件,定义menu的item,此代码文件在本例中称之为main.xml:

<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/search"
        android:title="搜索"
        app:actionViewClass="android.support.v7.widget.SearchView"
        app:showAsAction="ifRoom|collapseActionView"/>
    <item
        android:id="@+id/share"
        android:title="分享"
        app:actionProviderClass="android.support.v7.widget.ShareActionProvider"
        app:showAsAction="ifRoom|withText"/>
    <item
        android:id="@+id/setting"
        android:title="设置"
        app:showAsAction="never"/>
    <item
        android:id="@+id/about"
        android:title="关于"
        app:showAsAction="ifRoom"/>

</menu>

在MainActivity.java中的一个方法体中,重写:
public boolean onCreateOptionsMenu(Menu menu);
方法将依据res/menu/main.xml文件创建菜单。在这个方法中,为id为search的menu item创建响应搜索事件。同时,附带的为搜索item绑定了展开和收缩事件:

OnActionExpandListener expandListener = new OnActionExpandListener() {
			@Override
			public boolean onMenuItemActionCollapse(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionCollapse", Toast.LENGTH_SHORT).show();
				return true;
			}

			@Override
			public boolean onMenuItemActionExpand(MenuItem item) {
				Toast.makeText(getApplicationContext(), "onMenuItemActionExpand", Toast.LENGTH_SHORT).show();
				return true;
			}
		};

		MenuItemCompat.setOnActionExpandListener(searchItem, expandListener);


对于菜单中分享菜单share item,则为其设置了ShareActionProvider,提供分享事件的数据和动作支持:

MenuItem shareItem = menu.findItem(R.id.share);
		ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);
		shareActionProvider.setShareIntent(getMyIntent());


其他次要普通的菜单选择事件则放在
public boolean onOptionsItemSelected(MenuItem item);
中完成。


图1是代码运行后,点击分享icon切换到微信的ActionBar状态:




图2则是点击了搜索item时候的ActionBar状态:


相关文章
|
9月前
|
XML Android开发 数据格式
Android AppCompatActivity 方法详解
Android AppCompatActivity 方法详解
265 0
|
9月前
|
XML Java Android开发
34. 【Android教程】菜单:Menu
34. 【Android教程】菜单:Menu
205 2
|
10月前
|
Android开发
Android中去掉ActionBar的几种方法
Android中去掉ActionBar的几种方法
186 0
|
10月前
|
XML Java Android开发
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
874 1
|
Android开发
cocoscreator打包 android 无法访问appcompatactivity的问题
cocoscreator打包 android 无法访问appcompatactivity的问题
|
Android开发
Android 中实现上下文菜单(Context menu)详解
Android 中实现上下文菜单(Context menu)详解
146 0
|
Android开发
Android 中选项菜单(Option menu)的用法
Android 中选项菜单(Option menu)的用法
252 0
|
XML Android开发 数据格式
Android 底部导航栏(一、BottomNavigationView+Menu+Fragment)
现在常用的App主页都会有一个底部导航栏,根据需求也使用过好几种方法进行实现,于是想着还是总结一下,今天还写一个简单的BottomNavigationView方法来实现这个功能
|
XML Java 数据格式
Android_三种常用Menu菜单(附源码)
记录一下我写菜单的代码,我写了一共有三种菜单,从常用到不常用。
233 0
|
Android开发
深入剖析Android四大组件(九)——Activity之AppCompatActivity与toolbar的结合(二)
深入剖析Android四大组件(九)——Activity之AppCompatActivity与toolbar的结合(二)
238 0
深入剖析Android四大组件(九)——Activity之AppCompatActivity与toolbar的结合(二)

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 6
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 7
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
  • 10
    Android实战经验之Kotlin中快速实现MVI架构
  • 1
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
    55
  • 2
    android FragmentManager 删除所有Fragment 重建
    25
  • 3
    Android实战经验之Kotlin中快速实现MVI架构
    39
  • 4
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    38
  • 5
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    43
  • 6
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    151
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    50
  • 8
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    66
  • 9
    Android历史版本与APK文件结构
    169
  • 10
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    52