Android之ActionBar

本文主要包括以下内容

  1. ActionBar的显示及隐藏,添加图标,返回主页
  2. ActionBar添加ActionView,添加ActionProvider
  3. ActionBar实现Tab
  4. ActionBar添加下拉列表

ActionBar介绍

在Android 3.0中除了我们重点讲解的Fragment外,Action Bar也是一个非常重要的交互元素,Action Bar取代了传统的tittle bar和menu,在程序运行中一直置于顶部,对于Android平板设备来说屏幕更大它的标题使用Action Bar来设计可以展示更多丰富的内容,方便操控

ActioinBar功能

<1> ActionBar的图标,可显示软件图标,也可用其他图标代替。当软件不在最高级页面时,图标左侧会显示一个左箭头,用户可以通过这个箭头向上导航;

  <2> 如果你的应用要在不同的View中显示数据,这部分允许用户来切换视图。一般的作法是用一个下拉菜单或者是Tab选项卡。如果只有一个界面,那这里可以显示应用程序的标题或者是更长一点的商标信息;

  <3> 两个action按钮,这里放重要的按钮功能,为用户进行某项操作提供直接的访问;

  <4> overflow按钮,放不下的按钮会被置于“更多…”菜单项中,“更多…”菜单项是以下拉形式实现的

ActionBar修改文字与图标

第一种方法

 <applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:logo="@drawable/cnblog_icon"android:supportsRtl="true"android:theme="@style/AppTheme">

在mainfest文件中设置label与logo,但图片却显示不出来,所心采用第二种方式,在代码中改变

ActionBar actionBar = getSupportActionBar();actionBar.setDisplayShowHomeEnabled(true);actionBar.setLogo(R.mipmap.ic_launcher);actionBar.setDisplayUseLogoEnabled(true);setTitle("abc");

添加按钮

ActionBar还可以根据应用程序当前的功能来提供与其相关的Action按钮,这些按钮都会以图标或文字的形式直接显示在ActionBar上。当然,如果按钮过多,ActionBar上显示不完,多出的一些按钮可以隐藏在overflow里面(最右边的三个点就是overflow按钮),点击一下overflow按钮就可以看到全部的Action按钮了。

当Activity启动的时候,系统会调用Activity的onCreateOptionsMenu()方法来取出所有的Action按钮,我们只需要在这个方法中去加载一个menu资源,并把所有的Action按钮都定义在资源文件里面就可以了。

那么我们先来看下menu资源文件该如何定义,代码如下所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item
        android:id="@+id/user_p"android:icon="@drawable/icon_user_p"android:showAsAction="always"android:title="用户"/><item
        android:id="@+id/write_p"android:icon="@drawable/icon_write_p"android:showAsAction="always"android:title="发布"/><item
        android:id="@+id/favo_p"android:icon="@drawable/icon_favo_p"android:showAsAction="never"android:title="收藏"/></menu>

接着,重写Activity的onCreateOptionsMenu()方法,代码如下所示:

@Override 
public boolean onCreateOptionsMenu(Menu menu) {  MenuInflater inflater = getMenuInflater();  inflater.inflate(R.menu.menu_main, menu);  
return super.onCreateOptionsMenu(menu);  
}

响应Action按钮的点击事件

当用户点击Action按钮的时候,系统会调用Activity的onOptionsItemSelected()方法,通过方法传入的MenuItem参数,我们可以调用它的getItemId()方法和menu资源中的id进行比较,从而辨别出用户点击的是哪一个Action按钮,比如:

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {  case R.id.user_p:  Toast.makeText(this, "你点击了“用户”按键!", Toast.LENGTH_SHORT).show();  return true;  case R.id.write_p:  Toast.makeText(this, "你点击了“发布”按键!", Toast.LENGTH_SHORT).show();  return true;  case R.id.favo_p:  Toast.makeText(this, "你点击了“收藏”按键!", Toast.LENGTH_SHORT).show();  return true;  default:  return super.onOptionsItemSelected(item);  }  }

效果如下

这里写图片描述

返回主页实现

首先设置setDisplayHomeAsUpEnable

ActionBar actionBar = getActionBar();  
actionBar.setDisplayHomeAsUpEnabled(true); 

第二步需要在AndroidManifest.xml中配置父Activity,如下所示:

<activity android:name="com.yanis.actionbar.TabActivity"android:parentActivityName="com.yanis.actionbar.MainActivity" > 
</activity> 

第三步则需要对android.R.id.home这个事件进行一些特殊处理,如下所示,重写方法:

@Override 
public boolean onOptionsItemSelected(MenuItem item) {  switch (item.getItemId()) {  case android.R.id.home:  Intent upIntent = NavUtils.getParentActivityIntent(this);  if (NavUtils.shouldUpRecreateTask(this, upIntent)) {  TaskStackBuilder.create(this)  .addNextIntentWithParentStack(upIntent)  .startActivities();  } else {  upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  NavUtils.navigateUpTo(this, upIntent);  }  return true;  ......  }  
}

添加ActionView

ActionView是一种可以在ActionBar中替换Action按钮的控件,它可以允许用户在不切换界面的情况下通过ActionBar完成一些较为丰富的操作。比如说,你需要完成一个搜索功能,就可以将SeachView这个控件添加到ActionBar中。

为了声明一个ActionView,我们可以在menu资源中通过actionViewClass属性来指定一个控件

<itemandroid:id="@+id/action_search"android:actionViewClass="android.widget.SearchView"android:showAsAction="always"android:title="搜索"/>

但这种写法似乎有兼容性问题,无法达到效果,在item中将actionViewClass去除,在代码中实现

  MenuItem item=menu.findItem(R.id.action_search);item.setActionView(R.layout.searchview);

其中searchView如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><SearchView
        android:layout_width="match_parent"android:layout_height="wrap_content"></SearchView></LinearLayout>

添加Action Provider

和Action View有点类似,Action Provider也可以将一个Action按钮替换成一个自定义的布局。但不同的是,Action Provider能够完全控制事件的所有行为,并且还可以在点击的时候显示子菜单。

为了添加一个Action Provider,我们需要在标签中指定一个actionViewClass属性,在里面填入Action Provider的完整类名。我们可以通过继承ActionProvider类的方式来创建一个自己的Action Provider,同时,Android也提供好了几个内置的Action Provider,比如说ShareActionProvider。

由于每个Action Provider都可以自由地控制事件响应,所以它们不需要在onOptionsItemSelected()方法中再去监听点击事件,而是应该在onPerformDefaultAction()方法中去执行相应的逻辑。

那么我们就先来看一下ShareActionProvider的简单用法吧,编辑menu资源文件,在里面加入ShareActionProvider的声明,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" ><item android:id="@+id/action_share" android:actionProviderClass="android.widget.ShareActionProvider" android:showAsAction="ifRoom" android:title="分享" /> 
...
</menu>

接着剩下的事情就是通过Intent来定义出你想分享哪些东西了,我们只需要在onCreateOptionsMenu()中调用MenuItem的getActionProvider()方法来得到该ShareActionProvider对象,再通过setShareIntent()方法去选择构建出什么样的一个Intent就可以了。代码如下所示:

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu_main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) shareItem.getActionProvider();provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}

但shareItem.getActionProvider()会得到空指针异常,所以修改为

@Overridepublic boolean onCreateOptionsMenu(Menu menu) {MenuInflater inflater = getMenuInflater();inflater.inflate(R.menu.menu_main, menu);MenuItem shareItem = menu.findItem(R.id.action_share);ShareActionProvider provider = (ShareActionProvider) MenuItemCompat.getActionProvider(shareItem);provider.setShareIntent(getDefaultIntent());return super.onCreateOptionsMenu(menu);}private Intent getDefaultIntent() {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("image/*");return intent;}

效果如下

这里写图片描述

添加导航Tab

Tabs的应用可以算是非常广泛了,它可以使得用户非常轻松地在你的应用程序中切换不同的视图。而Android官方更加推荐使用ActionBar中提供的Tabs功能,因为它更加的智能,可以自动适配各种屏幕的大小。比如说,在平板上屏幕的空间非常充足,Tabs会和Action按钮在同一行显示

主要有三步

下面我们就来看一下如何使用ActionBar提供的Tab功能,大致可以分为以下几步:

  1. 实现ActionBar.TabListener接口,这个接口提供了Tab事件的各种回调,比如当用户点击了一个Tab时,你就可以进行切换Tab的操作。

2.为每一个你想添加的Tab创建一个ActionBar.Tab的实例,并且调用setTabListener()方法来设置ActionBar.TabListener。除此之外,还需要调用setText()方法来给当前Tab设置标题。

3.最后调用ActionBar的addTab()方法将创建好的Tab添加到ActionBar中。

详情见【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解 - 叶超Luka - 博客园

主要需要注意到在用Android Studio开发时,使用ActionBar actionBar = getActionBar();会得到空指针异常,所以要全部改成ActionBar actionBar = getSupportActionBar();其中ActionBar来自于import android.support.v7.app.ActionBar;

效果如下

这里写图片描述

添加下拉列表导航

.1 简单介绍

作为Activity内部的另一种导航(或过滤)模式,操作栏提供了内置的下拉列表。下拉列表能够提供Activity中内容

的不同排序模式。

启用下拉式导航的基本过程如下:

<1> 创建一个给下拉提供可选项目的列表,以及描画列表项目时所使用的布局;

<2> 实现ActionBar.OnNavigationListener回调,在这个回调中定义当用户选择列表中一个项目时所发生的行为;

<3> 用setNavigationMode()方法该操作栏启用导航模式;

<4> 用setListNavigationCallbacks()方法给下拉列表设置回调方法。

实现

准备列表数据( strings.xml)

  <string-array name="action_list"><item>Fragment1</item><item>Fragment2</item><item>Fragment3</item></string-array>```  主界面代码  

package com.yanis.actionbar;

import android.app.ActionBar;
import android.app.ActionBar.OnNavigationListener;
import android.app.Activity;
import android.app.Fragment;
import android.app.TaskStackBuilder;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NavUtils;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.SpinnerAdapter;

public class ListActivity extends Activity {
private OnNavigationListener mOnNavigationListener;
private String[] arry_list;

@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_list);initView();
}/*** 初始化组件*/
private void initView() {ActionBar actionBar = getActionBar();actionBar.setDisplayHomeAsUpEnabled(true);// //导航模式必须设为NAVIGATION_MODE_LISTactionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);// 定义一个下拉列表数据适配器SpinnerAdapter mSpinnerAdapter = ArrayAdapter.createFromResource(this,R.array.action_list,android.R.layout.simple_spinner_dropdown_item);arry_list = getResources().getStringArray(R.array.action_list);mOnNavigationListener = new OnNavigationListener() {@Overridepublic boolean onNavigationItemSelected(int position, long itemId) {Fragment newFragment = null;switch (position) {case 0:newFragment = new Fragment1();break;case 1:newFragment = new Fragment2();break;case 2:newFragment = new Fragment3();break;default:break;}getFragmentManager().beginTransaction().replace(R.id.container, newFragment,arry_list[position]).commit();return true;}};actionBar.setListNavigationCallbacks(mSpinnerAdapter,mOnNavigationListener);
}@Override
public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case android.R.id.home:Intent upIntent = NavUtils.getParentActivityIntent(this);if (NavUtils.shouldUpRecreateTask(this, upIntent)) {TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();} else {upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);NavUtils.navigateUpTo(this, upIntent);}return true;default:return super.onOptionsItemSelected(item);}
}

}
“`

主要是要将getFragmentManager改成getSupportFragmentManager应对版本问题

效果如下:

这里写图片描述

参考链接:

【Android UI设计与开发】8.顶部标题栏(一)ActionBar 奥义·详解 - 叶超Luka - 博客园

github代码地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国内智能音箱市场逐渐崛起,那么问题来了……

来源&#xff1a;AI锐见“嗨&#xff0c;Alexa&#xff0c;放首歌。”2014年&#xff0c;搭载了亚马逊虚拟语音个人助理Alexa的Echo面世&#xff0c;让人类同机器的交互方式出现了另一种可能。苹果联合创始人Steve Wozniak就曾在2016年表示&#xff0c;智能语音交互将成为计算领…

保留小数点位数和格式

JS 中 1. double运算 c parseFloat(a) parseFloat(b)) 2. 四舍五入&#xff0c;保留两位小数 c c.toFixed(2); 3. 去掉小数点后面多余的0 c c.toFixed(2)*100/100; JAVA中 Java代码 //四舍五入&#xff0c;保留指定小数位 public static Double roundDouble(Object obj, in…

Material Design入门

本文主要包括以下内容 ToolBar的使用 RecyclerView的定义与使用 ToolBar 风格 (style) 界面 (layout) 程序 (java) 首先自定义一个theme,并将AppTheme的parent改成我们自定义的theme (style.xml) <resources><style name"BaseAppTheme" parent"…

DARPA宣布未来五年将投资20亿美元开发下一波人工智能技术

来源&#xff1a;国防科技信息网作者&#xff1a;丁宏 中国船舶工业综合技术经济研究院 美国DARPA近日宣布&#xff0c;计划在未来5年内投资20亿美元用于开发下一波人工智能技术&#xff0c;寻求情境推理能力等技术的突破&#xff0c;使其有能力识别新的场景和环境并加以适应&a…

Material Design入门(二)

本文主要包括以下内容 侧滑菜单DrawerLayout实现 CardView实现 DrawerLayout介绍 drawerLayout是Support Library包中实现了侧滑菜单效果的控件&#xff0c;可以说drawerLayout是因为第三方控件如MenuDrawer等的出现之后&#xff0c;google借鉴而出现的产物。drawerLayout分…

李飞飞重回斯坦福,Andrew Moore接手谷歌云AI

来源&#xff1a;网络大数据6 月&#xff0c;海外媒体爆出「李飞飞或将离开谷歌重返斯坦福」;两周前&#xff0c;CMU 官方发布消息称 CMU 计算机学院院长 Andrew Moore 即将离职。今日&#xff0c;谷歌云博客发布的信息最终把二者的去向都敲定&#xff1a;Andrew Moore 加入谷歌…

UVA 10173 旋转卡壳

题意&#xff1a;给出一些点&#xff0c;求最小的覆盖这些点的矩形的面积。 题解&#xff1a; 枚举下边界&#xff08;是一条边&#xff09;&#xff0c;然后暴力卡壳左右边界&#xff08;点&#xff09;&#xff0c;再暴力上边界&#xff08;点&#xff09;&#xff0c;更新答…

Python Requests 丨爬虫基础入门

据说&#xff1a;看我文章的帅帅 都有个习惯&#xff1a;先点赞、收藏再看 目录 ⚽️ 一、背景知识&#xff1a;requests &#x1f3c0; 1、pip安装requests &#x1f3c8; 2、pycharm安装requests ⚾️ 3、一行代码使用requests &#x1f3be; 4、requests常用调用&…

类脑计算:让人工智能走得更远

来源&#xff1a;中国科学报像人一样思考&#xff0c;这是人们对人工智能和机器人的期待。大踏步前进的人工智能&#xff0c;似乎走到了十字路口。“机器综合智能水平和人脑相差较大&#xff0c;机器学习需要较多人工干预&#xff0c;不同人工智能模态之间交互协同较少……”近…

Android之Fragment(一)

Fragment的产生与介绍 Android运行在各种各样的设备中&#xff0c;有小屏幕的手机&#xff0c;超大屏的平板甚至电视。针对屏幕尺寸的差距&#xff0c;很多情况下&#xff0c;都是先针对手机开发一套App&#xff0c;然后拷贝一份&#xff0c;修改布局以适应平板神马超级大屏的…

《Python快速入门》基础知识扫盲课

据说:看我文章的帅帅 都有个习惯:先点赞、收藏再看 目录 🐜 1、Python 初体验 Pycharm 第一个程序 交互式编程第一个程序

数字技术对就业的影响分析

来源&#xff1a; 腾讯研究院技术是增长之源&#xff0c;就业是民生之本。技术进步对就业具有双重影响&#xff0c;它不仅带来新的工作机会&#xff0c;改善人们的生活&#xff1b;也会替代一些原有岗位&#xff0c;带来“技术性失业”。1930年&#xff0c;英国伟大的经济学家凯…

Android之Fragment(二)

本文主要内容 如何管理Fragment回退栈 Fragment如何与Activity交互 Fragment与Activity交互的最佳实践 没有视图的Fragment的用处 使用Fragment创建对话框 如何与ActionBar&#xff0c;MenuItem集成等 管理Fragment回退栈 类似与Android系统为Activity维护一个任务栈&#…

带你薅“云”羊毛:定个小目标,先薅他一年

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 一、2022年了&#xff0c;一块钱能干什么&#xff1f; 1块钱 能买一瓶矿泉水 1块钱 能坐一次公交 1块钱 竟然能买来一年的云服务器 哈哈哈&#xff0c;今天西红柿就带大家一块钱白嫖京东云服务器&#xff0c;当然&#xff0c;氪金也是…

ubuntu下搭建android开发环境(转载)

在ubuntu下搭建android开发环境&#xff0c;准备学习一下android开发。 1、安装JDK 首先到oracle的官网上下载linux版本的JDK&#xff08;网址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26&#xff0d;download-400750.html&#xff09;&#x…

《瓦森纳协定》——光刻机为什么就是不卖给中国!

来源&#xff1a;金属加工&#xff08;ID&#xff1a;mw1950pub&#xff09;谈起光刻机相信大家首先想到的是荷兰&#xff0c;确实如此&#xff0c;荷兰光刻机在全球都是数一数二的&#xff0c;就连最顶尖的光刻机制造公司ASML也位于荷兰&#xff0c;二荷兰光刻机之所以这么出名…

Material Design入门(三)

本文主要包括 CollapsingToolbarLayout实现滚动动画效果 ViewPagertabLayout实现左右类Tab效果 控件介绍 这次需要用到得新控件比较多&#xff0c;主要有以下几个&#xff1a; CoordinatorLayout 组织它的子views之间协作的一个Layout&#xff0c;它可以给子View切换提供…

干货|2018物流机器人行业报告发布!不容错过

来源&#xff1a;楼今岁阅 摘要&#xff1a;2018年&#xff0c;我们都在谈智能家居、智能交通、智能工业、智能安防等热门物联网话题&#xff0c;并且预计到2020年&#xff0c;中国物联网的整体规模将超过1.8万亿元。发展如此迅速&#xff0c;其涉及的领域一定会越来越广&#…

【年度回忆录】如何做到1年90000粉丝?

亲爱的小伙伴&#xff1a; 小伙伴你好&#xff0c;我是不吃西红柿&#xff0c;仅以此文作为 2021 年终总结&#xff0c;顺便跟大家分享一些博主的心得经验&#xff0c;希望你我和 CSDN 都越来越好&#xff01; 一、C站点滴 翻开 2021 CSDN 年度回忆录&#xff0c;有种难以言…

Material Design综合实例

背景知识 drawlayout的使用 recycleView的使用 CardView的使用 一些开源动画库的使用 ImageView的scaleType属性与adjustViewBounds属性 &#xff0c;参考链接&#xff1a; ImageView的android:adjustViewBounds属性 - - ITeye技术网站 Android ImageView的scaleType属性与…