<Android 基础(六)> ActionBar
介绍
Action Bar是一种新増的导航栏功能,在Android 3.0之后加入到系统的API当中,它标识了用户当前操作界面的位置,并提供了额外的用户动作、界面导航等功能。使用ActionBar的好处是,它可以给提供一种全局统一的UI界面,使得用户在使用任何一款软件时都懂得该如何操作,并且ActionBar还可以自动适应各种不同大小的屏幕。下面是一张使用ActionBar的界面截图:
其中,[1]是ActionBar的图标,[2]是两个action按钮,[3]是overflow按钮。
基本使用
添加ActionBar
–布局文件–
AndroidStudio自动创建的MainActivity继承自AppCompatActivity本身携带有ActionBar,这里想要使用ToolBar来实现ActionBar的功能,需要先修改下theme
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
使用Theme.AppCompat.Light.NoActionBar作为activity的风格,这里插述一下相关属性代表的界面位置
创建ToolBar对应的xml文件
toolbar.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/colorPrimary"
android:minHeight="?attr/actionBarSize"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
app:theme="@style/ThemeOverlay.AppCompat.ActionBar"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
</android.support.v7.widget.Toolbar>
这里把这个文件单独作为一个xml方便多个layout中包含
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rootlayout"
tools:context="mraz.com.actionbardemo.MainActivity"
android:orientation="vertical">
<include layout="@layout/toolbar"/>
<TextView
android:id="@+id/tv_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</LinearLayout>
主界面对应的layout中include刚才创建的toolbar.xml文件
main_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/action_search"
android:icon="@drawable/ic_search_black_24dp"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"
android:inputType="textCapWords"
android:imeOptions="actionSearch"
android:orderInCategory="80"
app:showAsAction="ifRoom|collapseActionView"/>
<item android:id="@+id/action_settings"
android:icon="@drawable/ic_apps_black_24dp"
android:title="Settings"
android:orderInCategory="100"
app:showAsAction="always"/>
<item android:id="@+id/action_info"
android:title="Details"
android:icon="@drawable/ic_report_black_24dp"
android:orderInCategory="90"
app:showAsAction="ifRoom"/>
</menu>
menu 对应的属性解释一下
| 属性值 | 意义 |
|---|---|
| id | 控件id |
| title | 标题(必需) |
| icon | 图标 |
| showAsAction | 控制显示到actionbar还是overflow |
| actionViewClass | 构建视图所使用的View |
| actionProviderClass | 基本同上 |
| menuCategory | 同种菜单项的种类。该属性可取4个值:container、system、secondary和alternative。通过menuCategroy属性可以控制菜单项的位置。例如将属性设为system,表示该菜单项是系统菜单,应放在其他种类菜单项的后面。 |
| orderInCategory | 同种类菜单的排列顺序。该属性需要设置一个整数值,越小越靠左 |
showAsAction的几个属性,解释一下
| 属性 | 意义 |
|---|---|
| ifRoom | 根据当前的空间大小调整 |
| never | 永远不会显示。只会在溢出列表中显示,而且只显示标题,所以在定义item的时候,最好把标题都带上 |
| always | 无论是否溢出,都会显示 |
| withText | withText值示意Action bar要显示文本标题。Action bar会尽可能的显示这个标题,但是,如果图标有效并且受到Action bar空间的限制,文本标题有可能显示不全。 |
| collapseActionView | 声明了这个操作视窗应该被折叠到一个按钮中,当用户选择这个按钮时,这个操作视窗展开。否则,这个操作视窗在默认的情况下是可见的,并且即便在用于不适用的时候,也要占据操作栏的有效空间。一般要配合ifRoom一起使用才会有效果。 |
–代码使用–
package mraz.com.actionbardemo;
import android.os.Bundle;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout rootlayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rootlayout = (LinearLayout) findViewById(R.id.rootlayout);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationIcon(R.drawable.ic_menu_black_24dp);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_info:
Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
break;
case R.id.action_search:
Snackbar.make(rootlayout, " Search ", Snackbar.LENGTH_SHORT).show();
break;
case R.id.action_settings:
Snackbar.make(rootlayout, " Settings ", Snackbar.LENGTH_SHORT).show();
break;
}
return super.onOptionsItemSelected(item);
}
}
比较关键的只有3行代码
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //获取toolbar
setSupportActionBar(toolbar); //设置成ActionBar
getMenuInflater().inflate(R.menu.main_menu, menu); //创建actionbar的菜单项
有了这些代码基本上就可以显示ActionBar,当然要实现与用户的交互,就需要对每一个item做对应的响应处理,这里根据菜单的id,做了简单的Snackbar的展示,开发者可以根据自己的需要实现更复杂的逻辑
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_info:
Snackbar.make(rootlayout, " Info ", Snackbar.LENGTH_SHORT).show();
break;
……
}
–效果图–
使用Action View
上面的例子中有个比较特殊的Menu Item
<item android:id="@+id/action_search"
android:icon="@drawable/ic_search_black_24dp"
app:actionViewClass="android.support.v7.widget.SearchView"
android:title="Search"
android:inputType="textCapWords"
android:imeOptions="actionSearch"
android:orderInCategory="80"
app:showAsAction="ifRoom|collapseActionView"/>
这里使用了actionViewClass,这个要设置shwoAsAction为 ifRoom|collapseActionView使用才行,其实删除collapseActionView,也是可以正常使用,只是体现的方式不一样。获取SearchView的方式
MenuItem item = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) item.getActionView();
SerachView 对象拿到之后可以对其属性进行操作。给Action View添加展开和收起的事件监听,实现方式
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main_menu, menu);
MenuItem searchitem = menu.findItem(R.id.action_search);
SearchView searchView = (SearchView) searchitem.getActionView();
MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
Snackbar.make(rootlayout, " onMenuItemActionExpand ", Snackbar.LENGTH_SHORT).show();
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
Snackbar.make(rootlayout, " onMenuItemActionCollapse ", Snackbar.LENGTH_SHORT).show();
return true;
}
});
return true;
}
拿到searchItem之后,执行
MenuItemCompat.setOnActionExpandListener(searchitem, new MenuItemCompat.OnActionExpandListener() );
–效果图–
使用ActionProviderClass
menu文件中使用
<item android:title="Share"
android:actionProviderClass="android.widget.ShareActionProvider"
android:orderInCategory="100"
app:showAsAction="always"
/>
类似的方式获取ActionProvider
MenuItem shareItem = menu.findItem(R.id.action_share);
ShareActionProvider mShareActionProvider = (ShareActionProvider)
MenuItemCompat.getActionProvider(shareItem);
mShareActionProvider.setShareIntent(……);
针对ActionProvider可以实现自定义的ActionProvider,继承基础类ActionProvider
ActionBar导航
启用ActionBar图标导航的功能,可以允许用户根据当前应用的位置来在不同界面之间切换。比如,A界面展示了一个列表,点击某一项之后进入了B界面,这时B界面就应该启用ActionBar图标导航功能,这样就可以回到A界面。
我们可以通过调用setDisplayHomeAsUpEnabled()方法来启用ActionBar图标导航功能
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
此时ActionBar左侧会出现一个返回的按钮
针对这返回按钮的事件响应还是在public boolean onOptionsItemSelected(MenuItem item) 方法中实现,它有一个固定的资源Id—- android.R.id.home
case android.R.id.home:
finish();
break;
简单的执行下和返回键相同的操作。结束当前activity
实现Activity之间的快速切换
新建一个ParentActivity.java
package mraz.com.actionbardemo;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
public class ParentActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_parent);
final Context mContext = this;
TextView textView = (TextView) findViewById(R.id.tv_parent);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.setClass(mContext , MainActivity.class);
startActivity(intent);
}
});
}
}
AndroidManifest.xml文件中做如下修改
<application
……>
<activity android:name=".ParentActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".MainActivity"
android:parentActivityName="mraz.com.actionbardemo.ParentActivity">
</activity>
</application>
这一句很关键
android:parentActivityName=”mraz.com.actionbardemo.ParentActivity”>
设置父Activity的名称,ParentActivity为启动Activity同时是MainActivity的父Activity
然后在MainActivity中针对这个返回按钮做一下处理,不再是简单的结束掉当前的这个Activity了,需要做出对应的导航的处理逻辑
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);
}
break;
其中,调用NavUtils.getParentActivityIntent()方法可以获取到跳转至父Activity的Intent,然后如果父Activity和当前Activity是在同一个Task中的,则直接调用navigateUpTo()方法进行跳转,如果不是在同一个Task中的,则需要借助TaskStackBuilder来创建一个新的Task。
这样,就按照标准的规范成功实现ActionBar导航的功能了。
–效果图–
<Android 基础(六)> ActionBar的更多相关文章
- <Android基础> (六) 数据存储 Part 1 文件存储方式
第六章 数据存储 6.1 持久化技术 持久化技术指将内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. 主要有三种方式用于简单地实现数据持久化功能:文件存储.S ...
- <Android基础> (六) 数据存储 Part 3 SQLite数据库存储
6.4 SQLite数据库存储 SQLite是一种轻量级的关系型数据库,运算速度快,占用资源少. 6.4.1 创建数据库 Android为了管理数据库,专门提供了SQLiteOpenHelper帮助类 ...
- <Android基础> (六) 数据存储 Part 2 SharedPreferences方式
6.3 SharedPreferences存储 SharedPreferences使用键值对的方式来存储数据.同时支持多种不同的数据类型. 6.3.1 将数据存储到SharedPreferences中 ...
- Android基础总结(8)——服务
服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务.服务的运行不依赖任何用户界面,即使当程序被切换到后台,或者用户打开了 ...
- Android基础——Fragment与Activity交互
今天继续讲解Fragment组件的特性,主要是跟Activity的交互和生命周期的关系,我们前面已经说过Fragment是依赖于Activity的,而且生命周期也跟Activity绑定一起.下面我们看 ...
- android基础---->DiskLruCache的使用及原理
DiskLruCache是谷歌推荐的用来实现硬盘缓存的类,今天我们开始对于DiskLruCache的学习.DiskLruCache的测试代码:DiskLruCache的测试代码下载.关于FidkLru ...
- Android基础新手教程——4.1.3 Activity登堂入室
Android基础新手教程--4.1.3 Activity登堂入室 标签(空格分隔): Android基础新手教程 本节引言: 好的,在学习了两节的Activity后相信大家已经知道怎样去使用Acti ...
- Android基础新手教程——4.1.2 Activity初窥门径
Android基础新手教程--4.1.2 Activity初窥门径 标签(空格分隔): Android基础新手教程 本节引言: 上一节中我们对Activity一些主要的概念进行了了解,什么是Activ ...
- Android基础新手教程——4.1.1 Activity初学乍练
Android基础新手教程--4.1.1 Activity初学乍练 标签(空格分隔): Android基础新手教程 本节引言: 本节開始解说Android的四大组件之中的一个的Activity(活动) ...
- Android基础夯实--重温动画(一)之Tween Animation
心灵鸡汤:真正成功的人生,不在于成就的大小,而在于你是否努力地去实现自我,喊出自己的声音,走出属于自己的道路. 摘要 不积跬步,无以至千里:不积小流,无以成江海.学习任何东西我们都离不开扎实的基础知识 ...
随机推荐
- HashMap resize导致死循环
原文链接:https://blog.csdn.net/hll174/article/details/50915346 问题的症状 从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当 ...
- docker上安装eslaticsearch
一 elasticsearch安装 1 查找镜像: docker search elasticsearch 可以看到如下截图; 2 拉取镜像 docker pull elasticsearch 我并没 ...
- Web安全工程师(进阶)课程表
01-SQL注入漏洞原理与利用 预备知识: 了解HTTP协议,了解常见的数据库.脚本语言.中间件.具备基本的编程语言基础. 授课大纲: 第一章:SQL注入基础 1.1 Web应用架构分析1.2 SQL ...
- [PowerShell] check PowerShell Version
如果你已经开始在日常的工作中大量使用PowerShell自动化重复工作.建议你使用3.0以上的版本. 可以使用如下命令检测你的PS版本 如需要安装PowerShell,可以参看https://tech ...
- rpm命令相关
### .列出所有安装过的包 rpm -qa | grep sql ### .如何获得某个软件包的文件全名. rpm -q mysql ### .rpm包中的文件安装到那里 rpm -ql lrzsz ...
- /var 目录下文件系统
/var :日志文件/var/log:各种系统日志存放地*/var/log/message :系统信息默认日志文件 (非常重要)按周自动轮循/var/log/secure :记录登入系统信息文 ...
- java——为什么要有接口?和抽象类有什么不一样?
1.接口不是类,为什么? 接口如果是类,那就失去了java引入接口的意义了. java之所以引入接口,就是为了弥补不能多继承的缺点,在java中每个类只能有一个超类,但却可以实现多个接口. 2.接口可 ...
- Jenkins遇到哪些坑~
1Jenkins关闭和重启实现方式. 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/ ...
- Django-5.1 模型层 单表操作
7.1 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开 ...
- 闲里偷忙的CPU-某个kwoker进程忙
https://zhuanlan.zhihu.com/p/34311472 有一类比较特殊的CPU使用率问题,这类问题的特点是,系统平均CPU使用率很低,但是个别CPU的使用率非常高.今天借助这个真实 ...