AppCompat (AppCompatActivity) Jetpack

article/2025/10/18 19:22:51

进入AppCompat章节后,我们发现它又被分为了4个部分,这4个部分被称为“key class”,也就是重点类,它们分别是:

  • ActionBar:提供Actionbar用户界面模式的实现;
  • AppCompatActivity:添加可用作使用支持库操作栏实现的Activity的基类;
  • AppCompatDialog:添加一个可用作AppCompat主题的Dialog的基类;
  • ShareActionProvider:添加对可包含在ActionBar中的标准化共享操作(如电子邮件或发布到社交应用程序)的支持。

原文:Android Jetpack之AppCompat - Actionbar篇 萧文翰

今天我们来聊一聊有关AppCompat,作为Android Jetpack系列文章的开篇。说到Android Jetpack,我们先看一下这张图:

Jetpack一览


从图中我们可以看到,整个Android Jetpack分为了四大部分,而我们今天要讲述的就是Foundation中的AppCompat小节,官方将该部分翻译为“基础”。
Google官方网站:
https://developer.android.com/jetpack
按照Google官方的描述,AppCompat就是指v7 appcompat库。

 

“This library adds support for the Action Bar user interface design pattern. This library includes support for material design user interface implementations.”

意思是:此库添加了对操作栏用户界面设计模式的支持。这个库包括对Material Design用户界面实现的支持。也就是说,我们可以借助该库,对Material Design有更便捷和兼容性更好的实现。
进入AppCompat章节后,我们发现它又被分为了4个部分,这4个部分被称为“key class”,也就是重点类,它们分别是:

  • ActionBar:提供Actionbar用户界面模式的实现;
  • AppCompatActivity:添加可用作使用支持库操作栏实现的Activity的基类;
  • AppCompatDialog:添加一个可用作AppCompat主题的Dialog的基类;
  • ShareActionProvider:添加对可包含在ActionBar中的标准化共享操作(如电子邮件或发布到社交应用程序)的支持。

想要使用这些类,我们需要添加v7支持库。
到现在为止,支持库的最新版本是28,添加的库名称和版本如下:

com.android.support:appcompat-v7:28.0.0

今天我们就先来聊一聊ActionBar,也是这里面最为复杂的一个部分。
依稀记得,伴随着Google I/O 2014的召开,早在Android 5.0的时代,Google 官方推出了ToolBar组件,在那之后,ToolBar就登上了历史舞台,扮演着重要的角色。之前我在CSDN上面也发表过相关主题的文章,因为发布的时机刚好是ToolBar登场之际,所以获得了很多的阅读量。快5年过去了,回头再看那几篇连载,感觉文笔很是稚嫩。今天借着讲述Jetpack,再次聊聊ToolBar那些事,相信你我都会有新的收获。

首先解决疑问:

  1. 问:既然有了ActionBar,为何还要用ToolBar?
    答:使用AppCompat Toolbar能兼容更广泛的设备(ActionBar要求最低Android 3.0,ToolBar要求最低Android 2.1,但只有Android 5.0及以上才能在不使用AppCompat兼容包的前提下支持Material Design),以及各式各样的自定义需求。

  2. 问:ToolBar上面都应该包含哪些内容?
    答:根据Google的指导,应用栏区域应具备以下要素:
    1)一个专用区域,可以标识您的应用并指示用户在应用中的位置;
    2)以可预测的方式访问搜索等重要操作;
    3)支持导航和视图切换(通过标签页或下拉列表)。

一、添加ToolBar
想要添加一个ToolBar,总共3步走:
1. 更改application主题样式,操作对象:styles.xml。
对于新建的Android项目,AndroidManifest.xml中已经定义了所使用的theme,即:

android:theme="@style/AppTheme"

此时,我们修改styles.xml文件即可,将默认的继承值改掉,如下所示:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">

2. 在Activity布局中添加ToolBar,操作对象:layout布局文件

<android.support.v7.widget.Toolbarandroid:id="@+id/activity_main_tb"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"android:elevation="4dp"android:theme="@style/ThemeOverlay.AppCompat.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

对高度掌握不好火候的同学,直接如上使用ActionBar的高度就可以了。
android:evevation指“仰角”,这部分知识请参考:
https://developer.android.com/training/material/shadows-clipping
这里就不再赘述了。
如果你的项目已经迁移到Android X,你的布局文件代码片应该是:

<androidx.appcompat.widget.Toolbarandroid:id="@+id/activity_main_tb"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"android:elevation="4dp"android:theme="@style/ThemeOverlay.AppCompat.ActionBar"app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

3. 在Activity类中找到ToolBar,并应用它,操作对象:Activity类
这一步并不复杂,参考普通的Android控件。类似地,我们通过findViewById()找到ToolBar,并做执行一些设定,即可完成该步骤,示例如下:

 

private Toolbar topTb;
topTb = findViewById(R.id.activity_main_tb);        
setSupportActionBar(topTb);

一旦我们setSupportActionBar()后,日后我们就可以通过getSupportActionBar()方法来获取ToolBar实例,也可以使用兼容包提供的ActionBar的各种API方法了。
到此,我们就完成了ToolBar的添加,还算简单吧?

二、ToolBar外观的自定义
不出意外的话,我们运行的结果将会和下图类似:

默认的配色方案


大绿底,大黑字,实在不怎么好看。
那么,如果我们想要自定义配色方案,该如何做呢?参考下图:

配色方案指导


这些值我们都可以在color.xml中定义,并在styles.xml中引用。下图是一个重新定义配色方案后的截图:

自定义的配色方案
相关的代码片:
color.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><color name="colorPrimary">#002FA7</color><color name="colorPrimaryDark">#001F67</color><color name="colorAccent">#003FB7</color><color name="textColorPrimary">#FFFFFF</color>
</resources>

styles.xml

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar"><item name="colorPrimary">@color/colorPrimary</item><item name="colorPrimaryDark">@color/colorPrimaryDark</item><item name="colorAccent">@color/colorAccent</item><item name="android:textColorPrimary">@color/textColorPrimary</item>
</style>

细心的读者会发现,后面的截图中,右上角多了菜单项,这又是如何实现的呢?我们继续往后看。

三、给ToolBar增加动作
首先我们来看看如何给ToolBar增加菜单,我们依然分为3步完成。
1. 编写菜单xml文件,操作对象: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"><itemandroid:id="@+id/menu_main_info"android:title="@string/menu_main_activity_info"app:showAsAction="never" /><itemandroid:id="@+id/menu_main_search"android:title="@string/menu_main_activity_search"app:actionViewClass="android.support.v7.widget.SearchView"app:showAsAction="always" />
</menu>

如上,我们可以看到有两个item,分别对应Info和搜索,我们使用"app:showAsAction"的值来控制这个菜单是否显示,常见的值有always,ifRoom,never。从字面上也很好理解,这里就不多解释了。

2. 接下来是Java代码片段:

private SearchView tbSearchSv;@Override
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main_activity_menu, menu);MenuItem searchItem = menu.findItem(R.id.menu_main_search);tbSearchSv = (SearchView) searchItem.getActionView();return super.onCreateOptionsMenu(menu);
}

细心的朋友会发现有这一行:

app:actionViewClass="android.support.v7.widget.SearchView"

它是做什么的呢?

搜索栏效果

对了!它就是搜索栏,是原生的搜索栏。所以某些情况下,这个搜索栏是不用自己去实现的,系统已经给我们提供了SearchView!
典型的APP:网易云音乐、知乎上方的搜索都是这样的。

3. 为菜单设置监听器,我们先来看最普通的Info按钮,我们只需在Java代码中Override指定的方法就可以了,如下所示:

 

@Override
public boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.menu_main_info:Toast.makeText(MainActivity.this, R.string.menu_main_activity_info, Toast.LENGTH_LONG).show();break;}return super.onOptionsItemSelected(item);
}

对于搜索栏,首先我们想到的是,如何获取用户输入的内容呢?
其实很简单,玄机在于SearchView,只需对SearchView添加监听器就可以了。

 

tbSearchSv.setOnQueryTextListener(new SearchView.OnQueryTextListener() {@Overridepublic boolean onQueryTextSubmit(String s) {return false;}@Overridepublic boolean onQueryTextChange(String s) {return false;}
});

这里要注意,设置监听器前,要确保SearchView(这里的tbSearchSv)已经被实例化,否则,会出现空指针异常崩溃。
关于SearchView,还有一写额外的设置,比如:

 

// 设置提交按钮是否可见(默认不可见)
tbSearchSv.setSubmitButtonEnabled(true);

提交按钮是否可见

// 设置左侧是否显示搜索图标(默认不可见)
tbSearchSv.setIconifiedByDefault(false);

 

左侧是否显示搜索图标
更多可使用的API请参考官方文档:
https://developer.android.google.cn/reference/android/widget/SearchView

不过,我们这里还需要做最后一点善后。如果你是一路下来照着本篇文章敲代码的话,在搜索框打开的情况下按一下返回键,你期待的是什么?是不是取消搜索操作,停留在当前界面?然而实际上是……退出了APP。
所以我们这里要对返回键的默认动作做一个“拦截”,具体可参考如下代码片:

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_BACK:if (!tbSearchSv.isIconified()) {tbSearchSv.setIconified(true);return true;}break;}return super.onKeyUp(keyCode, event);
}

这里SearchView的isIconfied()方法可以返回当前的SearchView展开状态。

四、返回上一层

ToolBar还有一个比较常见的功能就是左上角的返回按钮,提供返回上一层操作,很多的APP开发者都习惯于自定义一个ImageButton或类似的空间,然后使用美工提供的图像素材,设置监听器,写Selector……一套下来,费时费力。
其实Google已经为开发者提供了现成的非常易用的返回逻辑处理。要实现这些处理,两步就搞定了。

1. 在ToolBar对象上启用返回钮

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

这里注意,虽然之前将ToolBar通过setSupportActionBar()方式当做参数被set了一次,但是ToolBar类本身并不提供setDisplayHomeAsUpEnabled()方法,因此,我们还需要getSupportActionBar(),先获取ActionBar对象,然后使用该对象,而不是直接使用ToolBar对象。

2. 在AndroidManifest.xml中定义要跳转的Activity
如题,我们在AndroidManifest.xml中,对子Activity做处理,这里不要忘记兼容低版本的系统。

<activityandroid:name=".MainActivity"android:parentActivityName=".SecondActivity"><!-- 兼容 Android4.0 及以下版本--><meta-dataandroid:name="android.support.PARENT_ACTIVITY"android:value=".SecondActivity" />
</activity>

将SecondActivity改为入口Activity,然后重新运行程序,将实现如下效果:

返回键视频演示

到此,关于ToolBar常见用法的梳理告一段落。源码请自取:
https://github.com/wh1990xiao2005/JetpackDemo

我会在接下来的文章中,和大家分享关于ToolBar的剩余内容,以及AppCompat兼容包中的其他知识,希望对你我都有帮助。
共勉!



作者:萧文翰
链接:https://www.jianshu.com/p/bb2a3f3da6fe
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


http://chatgpt.dhexx.cn/article/u7pqK37y.shtml

相关文章

【5】SpringBoot日志存储路径和设置日志格式

SpringBoot日志存储路径和设置日志格式 文章目录 SpringBoot日志存储路径和设置日志格式01、分析02、解决方案03、Springboot的日志的解决方案&#xff08;掌握&#xff09;04、查看springboot的日志的整个体系05、slf4j、logback和log4j三者的关系06、springboot的日志搭配07、…

nginx日志格式分析及修改

修改nginx日志打印格式 一. 打开终端&#xff0c;登录服务器并输入服务器密码 //ssh 用户名服务器ip ssh root192.168.0.132二. 切换到nginx目录 cd /var/log/nginx/三. 查看nginx日志 tail -f access.log日志说明&#xff1a; //默认的nginx标准日志格式 192.168.10.251 …

Nginx配置-日志格式配置

Nginx配置-日志格式配置 一、默认的日志格式二、我使用的日志格式三、参数四、测试效果 五一上线了一个小的预约程序&#xff0c;配置通过Nginx进行访问入口&#xff0c;默认的日志是没有请求时间的&#xff0c;因此需要配置一下&#xff0c;将每一次的请求的访问响应时间记录出…

Apache日志记录格式-LogFormat配置详解

Apache日志记录格式-LogFormat配置详解 前言 定制日志文件的格式涉及到三个指令&#xff0c;即LogFormat指令和CustomLog指令和ErrorLog指令&#xff0c;默认httpd.conf文件提供了关于这两个指令的几个示例。 格式设置 LogFormat LogFormat指令定义格式并为格式指定一个名…

springboot项目中日志使用----自定义日志格式(可直接使用)

springboot项目中日志使用 1、为什么加日志 1.1 日志是什么&#xff1f; 日志文件提供精确的系统记录&#xff0c;根据日志最终定位到错误详情和根源。日志的特点是&#xff0c;它描述一些离散的&#xff08;不连续的&#xff09;事件。例如&#xff1a;应用通过一个滚动的文…

python设置日志格式

# %(asctime)s 字符串形式的当前时间。 # %(levelname)s 文本形式的日志级别 # %(name)s Logger的名字 # %(filename)s 调用日志输出函数的模块的文件名 # %(funcName)s 调用日志输出函数的函数名 # %(lineno)d 调用日志输出函数的语句所在的代码行 # %(message)…

Log4j日志输出格式

Log4j日志输出格式 对于我才开始工作来说&#xff0c;输出日志唯一的目的就是打印代码的调试信息&#xff0c;当有项目运行什么问题或者错误可以通过查看日志快速的找到问题根源&#xff08;这也是我来公司最开始就遇到的问题&#xff09;。 先分享一个公司框架自带的通用日志…

logback 日志输出格式

强烈推荐一个大神的人工智能的教程&#xff1a;http://www.captainai.net/zhanghan​ 【前言】 日志对一个系统的重要性不言而喻&#xff1b;日志通常是在排查问题时给人看&#xff0c;一个友好的输出样式让人看到后赏心悦目&#xff0c;排查效率通常也会随之提高&#xff1b;…

Nginx的日志格式

vim /etc/logstash/conf.d/ filter模块的作用&#xff1a;过滤&#xff0c;{在一个大的真空管里面&#xff0c;中间有一个过滤网&#xff0c;只有比这个小的东西能过去&#xff0c;大的会拦住} 在grok中使用match进行选择&#xff0c;所传送过来的是下面这样。希望把他们变成i…

什么是日志文件

文章目录 什么是日志文件Centos 7 日志文件简易说明日志文件的重要性Linux常见的日志文件文件名/var/log/boot.log/var/log/cron/var/log/dmesg/var/log/lastlog/var/log/maillog或 /var/log/mail/*/var/log/messages/var/log/secure/var/log/wtmp、/var/log/faillog/var/log/h…

AE2018插件AfterCodecs v1.9.0安装教程,(AE mp4)

1.自己百度下载好 2.这2个文件夹要复制&#xff0c;其他可以不管 复制Autokroma AfterCodecs 文件夹到 C:\Program Files\Adobe\Common\Plug-ins\7.0\MediaCore 复制com.autokroma.afcpanel 文件夹到 Adobe After Effects CC 2018\Support Files\Plug-ins\Extensions&#x…

PS/PR/AE全套插件一键安装包无需注册码

注意事项&#xff1a; 1、下载前请关闭360、电脑管家等杀毒软件&#xff0c;否则会误报病毒导致无法安装&#xff1b; 2、安装PS/PR/AE插件合集前&#xff0c;请务必先安装好Adobe软件&#xff1b; 3、安装PS/PR/AE插件合集前&#xff0c;请务必关闭Adobe旗下所有软件。 安装步…

Ae 2020最新版下载地址 一键安装Windows

各类cc软件。 地址&#xff1a;https://www.yuque.com/docs/share/cf424323-49e5-43e6-a80c-4f07ce467d56 访问密码&#xff1a;关注公众号"糊糊省钱"&#xff0c;回复“ps”获取

Adobe After Effects(AE)2022软件安装[MAC]

Adobe After Effects简称“AE”&#xff0c;Adobe After Effects 2022mac是Adobe公司推出的一款图形视频处理软件&#xff0c;适用于从事设计和视频特技的机构&#xff0c;包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室&#xff0c;属于层类型后期软件。Adobe…

AE CC2018/64位安装步骤及各种出现问题!!(真的装了好久)

最近爱上录vlog&#xff0c;但是作为一个计算机学院的学生我怎么仅仅局限于手机里的剪视频软件呢&#xff01;然后我打算学一下AE&#xff0c;但是在这个py的过程中&#xff0c;真的废了快一个晚上了&#xff0c;从第一次安装出现问题我就应该立马百度&#xff0c;但是我没有&a…

2023AE软件、Adobe After Effects安装下载教程

2023AE软件是一款由Adobe公司开发的视频编辑软件&#xff0c;也被称为Adobe After Effects。它在广告、电影、电视和网络视频等领域广泛应用&#xff0c;用于制作动态图形、特效、合成和其他视觉效果。该软件支持多种视频和音频文件格式&#xff0c;具有丰富的插件和预设&#…

Adobe After Effect (AE) cc2020 安装教程【64位】

Adobe After Effects简称“AE” 是Adobe公司推出的一款图形视频处理软件&#xff0c;适用于从事设计和视频特技的机构&#xff0c;包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室。属于层类型后期软件。 ----介绍来源于百度 【软件名称】&#xff1a; After …

【AE2019】Adobe_After_Effects_2019软件下载及安装教程

下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1-foCrqbfKugK6cf7M4nevQ 提取码&#xff1a;6ewm 下载方式&#xff1a; 复制链接到浏览器中打开&#xff0c;输入提取码&#xff0c;保存到网盘&#xff0c;然后打开百度网盘&#xff08;PC端&#xff09;&a…

AE中文版 AE2021中文版下载 AfterEffects2021中文版ACR14.0最新下载和安装

AE我目前最为专业也是最火的特效制作工具&#xff0c;全称叫AfterEffects&#xff0c;现在最新的就是2021的&#xff0c;而且是中文&#xff0c;并且内置的ACR已更新到最新的14.0&#xff0c;非常适合新手朋友刚开始零基础入门学习使用&#xff0c;并且非常好上手&#xff0c;学…

After Effects 2021软件安装包

Ae 2021的全称是After Effects 2021&#xff0c;它是由Adobe公司研发推出的一款功能强大全面的视频制作软件&#xff0c;这款软件不仅仅可以帮助用户制作出各种精彩且有创意的动画、视频等作品&#xff0c;还可以凭借着自己的思维给视频作品添加文字、音乐、片头以及标题等&…