Android Jetpack基础组件之AppCompat

article/2025/10/18 19:30:47

1.简介

相比苹果封闭的IOS系统,Android系统的开放性带来了很多的优势。与此同时,也带来了严重的碎片化问题,包括硬件的碎片化和软件碎片化。这里,我们主要说的是软件方面。各Android设备厂商,受限于成本和技术原因,往往无法及时把系统版本更新到最新的Android版本。这导致低版本的Android系统在市场上仍然有很高的占有率。如下是2019年7月统计的Android设备中系统版本的市场占有率分布情况。注:此数据来源于Google Play,有可能没有包含国内厂商不支持GMS的系统。
在这里插入图片描述
额外说一句,统计各版本系统在市场上的占有率,有什么意义呢?对于App开发者而言,当然是希望自己的应用,能在尽可能多的设备上运行,服务更多的用户(赚更多的钱),那么,当前市场上,什么版本的系统最多,自然是开发者需要考虑着重适配的系统版本了。举个栗子,如果你的app,只能支持Android5.0(Lollipop),其他版本都不能运行,那么,就算所有5.0的机器都装上了你的App,也只有3%的市场份额而已。

所以,支持高版本系统,同时兼容低版本系统,一直是App开发者的心头好。

2.AppCompat特点

  • 以Library的形式, 独立包含在应用中 ,为App提供在低版本Android系统上运行的兼容性支持。
  • AppCompat最早出现在V7 Support Library中,现已迁移到AndroidX,后续会跟随AndroidX库持续更新。下图展示的是AppCompat与Jetpack、Support Library以及Androidx的关系。

在这里插入图片描述

3.主要组件及使用方法

本文将主要说明AndroidX中AppCompat的使用。

Tool Bar

直译为工具栏(官方称应用栏),或称Action Bar,提供显示在应用顶部快捷操作的实现方案。如下图示:
在这里插入图片描述
可以通过添加操作按钮,可以将在当前上下文中最重要的操作放在应用顶部。

例如,当用户浏览文件列表时,可以再应用的顶部显示“搜索”按钮;当用户浏览单张图片时,可以在应用顶部显示“收藏“按钮;也可以提供快速跳转到“设置”的按钮,完成

工具栏中的空间有限。如果应用声明的操作数量过多,导致应用栏无法容纳,则应用栏会将无法容纳的操作发送到“溢出”菜单。应用还可以指定某项操作应始终显示在溢出菜单中,而不是显示在应用栏中。
下面介绍在Fragment中添加Tool Bar的步骤;如果需要在Activity中添加Tool Bar,与此类似,也可以参考[官方文档]: https://developer.android.google.cn/training/appbar/setting-up.html “设置应用栏”

  • 装载Fragment的Activity需要扩展 androidx.appcompat.app.AppCompatActivity

    public class MyActivity extends AppCompatActivity {// ...
    }
    
  • 在应用清单中,将 元素设为使用 appcompat 的其中一个 NoActionBar 主题背景。使用其中一个主题背景可以防止应用使用原生 ActionBar 类提供应用栏。例如:

    <applicationandroid:theme="@style/Theme.AppCompat.Light.NoActionBar"
    />
    

    也可以把Theme定义在styles.xml文件中,如下所示,

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

    然后在清单文件中,使用这个Theme

    <applicationandroid:theme="@style/AppTheme">
    
  • 向Fragment的布局文件中添加一个ToolBar,下面的示例将在Fragment界面的顶部添加一个Toolbar.

    <androidx.appcompat.widget.Toolbarandroid:id="@+id/demo_toolbar"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"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />
    

    注:
    android:elevation 是应用栏的高度,可参阅官方文档 Material Design 规范。
    android:theme 是指ToolBar的Theme。
    app:popupTheme 是指ToolBar中点击“溢出”图标,弹出的菜单的Theme。

  • 在 Fragment的 onCreateView() 方法中,调用 AppCompatActivitysetSupportActionBar() 方法,并传入工具栏。同时,必须调用setHasOptionsMenu(true)方法,设置ToolBar可用,否则工具栏将不会被创建和显示。如下示例:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {View fragmentView = inflater.inflate(R.layout.fragment_tool_bar_demo, container, false);mToolbar = fragmentView.findViewById(R.id.demo_toolbar);mSearResultDemo = fragmentView.findViewById(R.id.search_demo_tv);((AppCompatActivity) getActivity()).setSupportActionBar(mToolbar);setHasOptionsMenu(true);//必须调用此方法return fragmentView;
    }
    
  • 自定义ToolBar上的按钮。

    ToolBar上的操作按钮可以在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_action_1"android:title="@string/menu_action_1"app:showAsAction="never" /><itemandroid:id="@+id/menu_action_2"android:title="@string/menu_action_2"app:showAsAction="never" /><itemandroid:id="@+id/menu_action_3"android:title="@string/menu_action_3"app:showAsAction="never" /><itemandroid:id="@+id/menu_action_search"android:title="@string/menu_search"app:actionViewClass="androidx.appcompat.widget.SearchView"app:showAsAction="ifRoom" /><itemandroid:id="@+id/menu_action_share"android:title="@string/menu_action_share"app:actionProviderClass="androidx.appcompat.widget.ShareActionProvider"app:showAsAction="ifRoom"/><itemandroid:id="@+id/menu_action_add_favorite"android:title="@string/menu_action_favorite"android:icon="@drawable/favorite"app:showAsAction="always" />
    </menu>
    

    注:
    app:showAsAction用來标识这个Menu Item在ToolBar上的显示状态,包含如下几种:

    always— 一直显示;
    ifRoom — 如果ToolBar上有足够的空间,则显示,否则会放到“溢出”列表;
    never— 始终放到“溢出“列表,不管是否有空间。

  • 加载自定义的menu布局

    重写Fragment中的onCreateOptionsMenu()方法,加载上面的menu xml文件。例如:

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {inflater.inflate(R.menu.tool_bar_menu, menu);super.onCreateOptionsMenu(menu, inflater);
    }
    
  • 响应点击事件

    重写Fragment中的onOptionsItemSelected()方法,处理按钮的点击事件,如下所示:

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {switch(item.getItemId()) {case R.id.menu_action_1:// Add your code for action_1 button clickedbreak;case R.id.menu_action_2:break;case R.id.menu_action_3:break;case R.id.menu_action_add_favorite:break;default:break;}return super.onOptionsItemSelected(item);
    }
    
  • 使用Tool Bar的Utility方法

    将工具栏设为 Fragment的应用栏后,如果要使用 ToolBar的Utility方法,可调用 Activity的 getSupportActionBar() 方法。此方法将返回对 appcompat ActionBar 对象的引用。获得该引用后,您就可以调用任何 ActionBar 方法来调整应用栏。例如,要隐藏应用栏,可调用 ActionBar.hide()

AppCompatActivity

可作为应用的Activity的基类,替换原生的Activity基类,实现有ToolBar的应用界面;目前,AppCompatActivity 通过间接继承ComponentActivity,现了LifecycleOwner接口,在应用自己的Activity中,可以通过 getLifecycle() 方法拿到 Lifecycle ,并添加 Observer 来实现对 Activity 生命周期的监听。 如下示例:

public class MyActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);testLifecycle();}private void testLifecycle() {getLifecycle().addObserver(new LifecycleObserver() {@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)void onResume(){Log.d(TAG, "onResume: called by LifecycleObserver");}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)void onPause() {}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)void onDestroy() {}});}
}

AppCompatDialog

对话框类,使用此基类配合AppCompatActivity,可以实现与App其他界面风格统一的对话框。

  • styles.xml文件定义如下的风格样式
<resources><style name="myDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert"><item name="colorAccent">@color/myColorAccent</item><item name="android:textColorPrimary">@color/myTextColorPrimary</item><item name="android:background">@color/myDialogBackGroundColor</item></style>
</resources>
  • 构建AppCompatDialog时指定样式
private void testAppCompatDialog() {AlertDialog.Builder builder = new AlertDialog.Builder(this,R.style.myDialogStyle);builder.setTitle("AppCompatDialog");builder.setMessage("This is a demo dialog");builder.setPositiveButton("OK", null);builder.setNegativeButton("Cancel", null);builder.show();
}
  • 效果展示
    在这里插入图片描述

ShareActionProvider

在应用栏上支持标准化分享操作,从而在应用之间通过Intent共享数据。例如发送电子邮件或发布到社交应用。
可以在onCreateOptionsMenu()中,初始化ShareActionProvider,并设置Intent,示例如下:

@Override
public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {MenuItem shareItem = menu.findItem(R.id.menu_action_share);mShareActionProvider = (ShareActionProvider)MenuItemCompat.getActionProvider(shareItem);Intent myShareIntent = new Intent(Intent.ACTION_SEND);myShareIntent.setType("text/plain");myShareIntent.putExtra(Intent.EXTRA_TEXT, "a single string for share");mShareActionProvider.setShareIntent(myShareIntent);super.onCreateOptionsMenu(menu, inflater);
}

参考资料

https://developer.android.google.cn/training/appbar
https://developer.android.google.cn/reference/androidx/appcompat/app/AppCompatActivity.html


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

相关文章

AppCompat发布两年了,还没了解?

近日随笔 近期疫情日渐严峻&#xff0c;大家多多保重&#xff0c;出门记得戴口罩。希望河北&#xff0c;黑龙江能尽早控制住好局面迎来拐点&#xff0c;全国人民过个好年。 为了能够让低版本的Android系统能够运行新特性&#xff0c;AppCompat框架自Support时代就已推出。但随着…

AppCompat (AppCompatActivity) Jetpack

进入AppCompat章节后&#xff0c;我们发现它又被分为了4个部分&#xff0c;这4个部分被称为“key class”&#xff0c;也就是重点类&#xff0c;它们分别是&#xff1a; ActionBar&#xff1a;提供Actionbar用户界面模式的实现&#xff1b;AppCompatActivity&#xff1a;添加可…

【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…