Android中通过ActionBar为标题栏添加搜索及分享视窗

在Android3.0之后,Google对UI导航设计上进行了一系列的改革,其中有一个非常好用的新功能就是引入的ActionBar,他用于取代3.0之前的标题栏,并提供更为丰富的导航效果。ActionBar的主要目的是:

1.提供一个用于识别应用程序的标示和用户的位置的专用空间。

2.在不同的应用程序之间提供一致的导航和视觉体验。

3.突出Activity的关键操作(如“搜索”、“创建”、“共享”等),并且在可预见的方法内给用户提供快捷的访问。

今天我们就简单梳理一下如何通过ActionBar为标题添加“搜索”和“分享”的操作视窗,如下图:

操作视窗是作为操作项目按钮的替代品显示在操作栏中的一个可视构件。例如,如果你有一个用于搜索的可选菜单项,你可以用Searchview类来替代操作栏上的搜索按钮。

要个菜单资源中的一个项目声明一个操作视窗,你既可以使用android:actionLayout属性也android:actionviewClass属性来分别指定一个布局资源或要使用的可视构件类。

与操作视窗类似,操作提供器(由ActionProvider类定义的)用一个定制的布局代替一个操作项目,它还需要对所有这些项目行为的控制。当你在操作栏中给一个菜单项声明一个操作项目时,它不仅要一个定制的布局来控制这个菜单项的外观,而且当它在显示在溢出菜单中时,还要处理它的默认事件。无论是在操作栏中还是在溢出菜单中,它都能够提供一个子菜单。例如,ActionProvider的扩展类ShareActionProvider,它通过在操作栏中显示一个有效的共享目标列表来方便共享操作。与使用传统的调用ACTION_SEND类型Intent对象的操作项不同,你能够声明一个ShareActionProvider对象来处理一个操作项。这种操作提供器会保留一个带有处理ACTION_SEND的Intent对象的应用程序的下拉列表,使这个菜单项显示在溢出菜单中。因此,当你使用像这样的操作提供器时,你不必处理有关这个菜单项的用户事件。要给一个操作项声明一个操作提供器,就要在菜单资源中对应的<item>元素中定义android:actionProviderClass属性,提供器要使用完整的类名。

第一步:建立menu资源文件

建立menu资源文件,设置搜索和分享的ITEM功能组件。

(1)新建menu文件夹,如图

(2)在menu资源文件夹下建立serch_share_menu.xml文件(自定义名称)

(3)serch_share_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/search" app:actionViewClass="android.support.v7.widget.SearchView" android:icon="@android:drawable/ic_menu_search" android:orderInCategory="100" android:title="搜索" app:showAsAction="always|collapseActionView" /> <item android:id="@+id/share" android:icon="@android:drawable/ic_menu_share" android:orderInCategory="200" android:title="共享" app:actionProviderClass="android.support.v7.widget.ShareActionProvider" app:showAsAction="ifRoom" /> </menu>

第二步:java中功能实现代码MainActivity.java:

import android.content.Intent; import android.support.v4.view.MenuItemCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.SearchView; import android.support.v7.widget.ShareActionProvider; import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; /** * Created by panchengjia on 2016/12/23. */ public class MainActivity extends AppCompatActivity { SearchView searchView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { //使用菜单填充器获取menu下的菜单资源文件 getMenuInflater().inflate(R.menu.search_share_menu,menu); //获取搜索的菜单组件 MenuItem menuItem = menu.findItem(R.id.search); searchView = (SearchView) MenuItemCompat.getActionView(menuItem); //设置搜索的事件 searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { Toast t = Toast.makeText(MainActivity.this, query, Toast.LENGTH_SHORT); t.setGravity(Gravity.TOP,0,0); t.show(); return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); //获取分享的菜单子组件 MenuItem shareItem = menu.findItem(R.id.share); ShareActionProvider shareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem); //通过setShareIntent调用getDefaultIntent()获取所有具有分享功能的App shareActionProvider.setShareIntent(getDefaultIntent()); return super.onCreateOptionsMenu(menu); } //设置可以调用手机内所有可以分享图片的应用 private Intent getDefaultIntent() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); //这里的类型可以按需求设置 intent.setType("image/*"); return intent; } }

虽然用actionBar可以实现这些功能,但在各个安卓版本和定制Rom中的效果表现不一,导致严重的碎片化问题,所以Google在2015的IO大会上发布了系列的Material Design风格的控件。其中ToolBar是替代ActionBar的控件。后面我们也会简述ToolBar的简单用法。

以上所述是小编给大家介绍的Android中通过ActionBar为标题栏添加搜索及分享视窗,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-11-01 12:02:42

Android中通过ActionBar为标题栏添加搜索及分享视窗的相关文章

Android中EditText如何去除边框添加下划线_Android

废话不多说了,直接给大家贴代码了. <span style="font-family: Arial, Helvetica, sans-serif;"><?xml version="1.0" encoding="utf-8"?> </span> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android中的activity的标题栏的文字是靠lable标签改变的吗

问题描述 android中的activity的标题栏的文字是靠lable标签改变的吗 android中的activity的标题栏的文字是靠lable标签改变的吗 多个activity的标题栏是如何改变的 解决方案 通过在manifest文件中,配置activity是通过android:name属性配置 解决方案二: 给每一个activity配置lable属性即可, 解决方案三: android:label 设置

Android中EditText如何去除边框添加下划线

废话不多说了,直接给大家贴代码了. <span style="font-family: Arial, Helvetica, sans-serif;"><?xml version="1.0" encoding="utf-8"?> </span> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

Android中使用TagFlowLayout制作动态添加删除标签

效果图 简单的效果图(使用开源库)[FlowLayout](" https://github.com/hongyangAndroid/FlowLayout ") 步骤 导包 compile 'com.zhy:flowlayout-lib:1.0.3' <com.zhy.view.flowlayout.TagFlowLayout android:id="@+id/id_flowlayout" zhy:max_select="-1" andro

Android版Vine及时升级:增强搜索及分享功能

新浪科技讯 北京时间6月22日上午消息,Twitter周五升级了短视频应用Vine的Android版,增加了根据标签或用户名进行搜索的功能.在升级之后,Android版Vine的功能与iOS版已基本一致. 在此次升级之后,Android版Vine用户还可以将Vine视频分享至Facebook.此前,Android版Vine只支持将视频分享至Twitter.不过,Android版Vine仍缺少iOS版的一项功能:对前置摄像头的支持. 本周四,Facebook为Instagram增加了视频拍摄及分享

android中开启actionbar的两种方法_Android

两种方法,第一种是静态开启方法 把application 或者 activity的主题设置为Theme.Holo即可 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.baidu.homer" android:versi

android中开启actionbar的两种方法

两种方法,第一种是静态开启方法 把application 或者 activity的主题设置为Theme.Holo即可 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.baidu.homer" android:versi

Android中获取状态栏高度的两种方法分享

前言 最近在做一个关于FAB的功能的时候需要获取状态栏的高度,在网上查了很多种方法,下面是选出的比较合理的两个方法.主要参考stackoverflow的这篇问答:http://stackoverflow.com/questions/3407256/height-of-status-bar-in-android 方法一: private double getStatusBarHeight(Context context){ double statusBarHeight = Math.ceil(25

settings-无法再android系统setting中的actionbar中添加switch

问题描述 无法再android系统setting中的actionbar中添加switch 在系统setting中添加了一个自己的选项.可惜在界面中的actionbar上无法添加switch 系统的蓝牙setting中有相同的结构.源码的添加switch代码如下: 大神们!!!求解啊!!!!!! Activity activity = getActivity(); Switch actionBarSwitch = new Switch(activity); if (activity instanc