事由
每次创建activity的时候都是继承AppcompatActivity,每次心里都是有疑问的,但每次为了赶项目,就是稍微了解一下,看看别人创建的activity也都是改成继承Activity,我也省事照做了,而没有过多的去了解AppcompatActivity,久而久之,就懒得去理它了,所以现在我觉得自己有必要对AppcompatActivity进行认识总结。
创建完一个demo项目后,刚开始看 HelloWorld 的目录结构,然后就发现Android Studio中的是

import android support.v7.app.AppcompatActivity;
public class MainActivity extends AppCompatActivity{......
}

而不是继承自Activity。以下是一些快捷键查看小贴士:
1.在光标指向AppCompatActivity,Ctrl+o即可查看本类中所有的方法
2.Alt+F7可以查看方法的引用
3.F4可以查看类的继承关系(Ctrl+H)

处理办法: Build Tools Version 选择最新版。

首先我们需要了解新引入的Android Support Library包:Android Support Library(安卓兼容包)是为了构件一个可以跑在不同版本Android平台的软件。它重构了AppCompat,在新的AppCompat中,加入主题色,Toolbar等功能。在新版本中推荐使用AppCompatActivity代替ActionBarActivity。

对于android:theme,新版本AppCompat允许了Toolbar使用android:theme代替app:theme,兼容API11+,Toolbar的xml文件如下,

 <android.support.v7.widget.Toolbarxmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/main_drawer_toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:layout_below="@+id/main_statusBar"android:background="?attr/colorPrimary"android:translationZ="4dp"android:popupTheme="@style/ThemeOverlay.AppCompat.Light"android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"/>

对于AppCompatDialog对话框,终于加入MD对话框和新主题theme Theme.AppCompat.Dialog使用,使用代码demo如下,

 AlertDialog.Builder builder = new AlertDialog.Builder(this);builder.setTitle("Dialog");builder.setMessage("少数派客户端");builder.setPositiveButton("OK", null);builder.setNegativeButton("Cancel", null);builder.show();

在API22之前我们使用标题栏基本都是在ActionBarActivity的Activity中处理的,而API22之后,谷歌遗弃了ActionBarActivity,推荐我们也可以说是强制我们使用AppCompatActivity。不过ActionBarActivity和AppCompatActivity的使用基本一样。

===============================================================================

下面进行更加详细的讲解:

  1. 初探AppCompatActivity
    按照androidStudio默认顺序创建项目,默认Activity继承自AppCompatActivity.代码如下:
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}
}

运行。下面我们来一步一步扩展其标题栏,让它的内容更加丰富多彩。

(1)AppCompatActivity与Toolbar结合
其实我们并不是要使用AppCompatActivity自带的标题栏,那样扩展会很麻烦,在14年的Android5.0的时候就用Toolbar替代了ActionBar,而ActionBarActivity又被AppCompatActivity替代,那么使用方法就是引入Toolbar设置到Activity中。
**a. 首先我们必须在配置文件中,写入Toolbar,**代码如下:

<android.support.v7.widget.Toolbarandroid:id="@+id/activity_main_toolbar"     android:layout_height="wrap_content"android:layout_width="match_parent"android:minHeight="?attr/actionBarSize"android:background="?attr/colorPrimary">
</android.support.v7.widget.Toolbar>

解释(1) android:minHeight = “?attr/actionBarSize”:设置标题栏最小高度为ActionBar的高度。
解释(2) android:background = “?attr/colorPrimary”:该主题下的主色。也就是默认的灰色
我们知道在AndroidManifest.xml清单文件下application中设置了android:theme = "@style/AppTheme"而查看APPTheme看到如下样式:

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"><!-- Customize your theme here. -->
</style>
</resources>

从名字我们就可以看出来,默认的标题栏为黑色。我们使用了Toolbar就必须修改样式文件,将原来的标题栏去掉,修改后的样式文件如下:

<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
</style>
</resources>

如下这个时候运行,那么你将看到界面也是没有标题栏的,因为你并没有设置到AppCompatActivity中去。

b. 将Toolbar显示到界面
我们创建一个方法名为initActionBar(),首先当然是获取Toolbar控件,然后将Toolbar设置到Activity中去。代码如下:

public void initActionBar() {Toolbar toolbar = (Toolbar) findViewById(R.id.activity_main_toolbar);
setSupportActionBar(toolbar);
}

现在我们运行,所得到的结果依然不是你期待的效果,下面我们将介绍AppCompatActivity的细节。

  1. AppCompatActivity详解

a. 设置title

我们可以看到,标题栏始终显示我们的项目名,这样显然给用户看是不理想的。那么怎么设置标题栏的字符串。我们可以在setSupportActionBar(toolbar)之前加入如下代码:

setTitle("huawei-xieguorong");

此setTitle(“huawei-xieguorong”)是AppCompatActivity的方法,并不是Toolbar的方法,那么我们运行一下程序得到还是不是我们想要的界面(运行效果图不贴了,大家如果有时间自己跟着步骤运行看效果,请多多见谅哈),那么我们将刚才的AppCompatActivity的setTitle换成Toolbar的setTitle看看效果会怎么样,其实结果如描述一样,没有任何变化。可能你希望title显示在中间,很遗憾,toolbar与AppCompatActivity并没有提供相关的方法,查了很多资料,看了很多博文,都没有比较好的解决办法,普遍的做法是在toolbar中加入一个TextView,配置其属性,让其显示在最中间,代码如下:

1.布局文件,在toolbar中加入一个TextView。

    <android.support.v7.widget.Toolbarandroid:id="@+id/toolbar"android:layout_width="match_parent"android:layout_height="?attr/actionBarSize"android:background="?attr/colorPrimary"app:popupTheme="@style/AppTheme.PopupOverlay"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:textSize="20sp"android:text="标题"/>
</android.support.v7.widget.Toolbar>

2.Activity代码,设置title为空字符串。

 protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);toolbar.setTitle("");setSupportActionBar(toolbar);
}

这样的操作虽然简单,但是粗暴的把原来的title设置为空字符串,虽然视觉上title是消失了,但理论上来说,title所在的TextView依然是存在的。不知道有没有更好的方法解决这个问题,如果有大家可以恢复我~~。

b. 设置回退按钮

假如我们这个界面并不是主界面,而是一个子界面,这个时候我有一个需求,需要回退到上一个界面,那么怎么设置左边的图标并实现其方法。其实很简单,在setSupportActionBar(toolbar);后面加入如下代码:

toolbar.setNavigationIcon(R.drawable.back);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {@Override
public void onClick(View v) {finish();}
});

为什么在setSupportActionBar(toolbar); 后面加,假如在前面加会怎样,你可以加入到前面试试,虽然可以显示回退的图片,但是点击并没有调用该按钮的点击事件,而在setSupportActionBar(toolbar); 后面设置点击才有反应。一定要记住,不然回退是不会起作用的。

c. 设置logo
设置logo在标题栏并不少见,比如网易APP首页,其实代码很简单,也仅仅需要一条代码即可,在setSupportActionBar(toolbar)前加入如下代码:

toolbar.setLogo(R.id.app_logo);

d.设置副标题
在setSupportActionBar(toolbar)前加入如下代码:

toolbar.setSubtitile("副标题");

e. 设置菜单

我们知道onCreateOptionMenu是上下文菜单,同理可以在该方法中设置菜单,代码如下:

1.Xml

<menuxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><itemandroid:id="@+id/action_settings"android:orderInCategory="100"android:title="设置"app:showAsAction="never"/>
</menu>

2.java

@Override

public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main, menu);return true;
}

此方法为Activity方法。因为你在上面已经将Toolbar设置到了Activity中,所以默认也会显示到标题栏中,如果你觉得这样不习惯,那么你可以添加一条语句,不过这条语句添加与否都没关系。

toolbar.setOnCreateContextMenuListener(this);

1.Toolbar的Style

标题下的Toolbar是蓝色,且有很好的Style,那么这是怎么设置呢?虽然我们这里重点是剖析Activity但是遇到有关Activity标题栏样式的还是要提到。我们粗略的讲解上面的标题栏用到了哪些Style:

a. #4876FF: 如第一步直接在Toolbar控件下面设置的属性一样,就是Toolbar的颜色
b. #3A5FCD:状态栏颜色也就是标题栏上面的那个颜色,而我用的是小米1S测试的,其固件并没有很好的实现其功能。
c. @android:color/white:窗口背景色,也就是Activity标题栏下面所有地方的颜色。

完整代码如下:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- toolbar(actionbar)颜色-->
<item name="colorPrimary">#4876FF</item>
<!-- 状态栏颜色 -->
<item name="colorPrimaryDark">#3A5FCD</item>
<!-- 窗口的背景颜色 -->
<item name="android:windowBackground">@android:color/white</item>
</style>

关于Toolbar菜单样式===============>

我们来看看如果直接使用上面的点击后边的菜单会有什么效果:

需要完成的任务是将该菜单的样式和其他App一样,在标题栏下面弹出。

首先要说明一下,toolbar菜单默认样式的父类为Widget.AppCompat.Light.PopupMenu.Overflow,那么要更改toobar中菜单的弹出的样式,就必须继承这个父类的样式。

其代码如下:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- toolbar(actionbar)颜色-->
<item name="colorPrimary">#4876FF</item>
<!-- 状态栏颜色 -->
<item name="colorPrimaryDark">#3A5FCD</item>
<!-- 窗口的背景颜色 -->
<item name="android:windowBackground">@android:color/white</item>
<item name="actionOverflowMenuStyle">@style/MyMenuStyle</item>
</style>
<style name="MyMenuStyle" parent="@style/Widget.AppCompat.Light.PopupMenu.Overflow">
<item name="overlapAnchor">false</item>
</style>

设置这一个属性那么其弹出的样式就与其他APP一样不会覆盖标题栏。

还有其他属性这里简要说明一下:

①?attr/colorPrimary:弹出菜单背景色为标题栏的背景色

②0dip:弹出菜单与标题栏的垂直间距

将这两条加入MyMenuStyle中就可以了实现如下图所示的弹出菜单:

最后介绍一下菜单里面重要的几个属性:

app:showAsAction有三个值:

always:总是显示在界面上never:不显示在界面上,只让出现在右边的三个点中ifRoom:如果有位置才显示,不然就出现在右边的三个点中

可以用 | 同时使用两个上面的值。

系统也为菜单提供了默认的分享菜单与查询菜单,代码如下:

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

从名字想必不需要过多解释,最后一个就是显示的优先级,也就是显示的顺序,谁在最前面,谁在后面:
android:orderInCategory数值越小,显示靠前,且优先级最大。

下面是源码对于AppCompatActivity中使用Dialog的一些说明,大家看一下:

Android Tips:Hello AppCompatActivity,Goodbye ActionBarActivity
Beautiful Dialogs
Previously, to open a dialog may have used the following code:
var builder = new AlertDialog.Builder (this);
builder.SetTitle ("Hello Dialog").SetMessage ("Is this material design?").SetPositiveButton ("Yes", delegate { Console.WriteLine("Yes"); }).SetNegativeButton ("No", delegate { Console.WriteLine("No"); });
builder.Create().Show ();

好了,我对AppCompatActivity的认识基本就这么多,对于标题栏,大家还可以去修改自己喜欢的样式和对标题栏代码进行封装。

新建项目AppCompatActivity报错问题相关推荐

  1. stm32 cubemx 新建项目一直报错的问题终于解决了

    之前一直都是自己写代码一点点写配置程序的,后面不是听说stm32有一个stm32 cubemx可以自动生成项目代码并配置好功能吗,后面就下载下来试了下,结果一堆坑,出问题都找不到解决方,后面花了好长时 ...

  2. kotlin新建项目的报错和自定义kotlin中的loge的live template

    Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveE ...

  3. Unity2019新建空项目都报错(有两个看不到的红色报错)怎么解决?

    Unity2019新建空项目都报错(有两个看不到的红色报错) 如下图所示. 正经解决方案:完全卸载重装Unity和hub.或者升级Unity到2020或以上版本. 不正经解决方案:跳过Unity hu ...

  4. android 开发时遇到的环境问题3--eclipse整个项目工程报错

    eclipse项目工程报错,但是里面的各个文件全都没有报错,不知所以. 查看problem,里面有错误 说是某个类的的问价无法读取,这个文件是我直接在本地拉进来的,eclipse不给力,报错了. 解决 ...

  5. IDEA中启动项目一直报错,找不到符号或 程序包不存在常见处理方式

    新安装的idea,配置与maven都安装好了,运行其他项目都正常,但运行某个项目时报错,提示:"Error:(4, 25) java: 找不到符号符号:类 xxx位置:程序包 xxx.xxx ...

  6. server 2008 mysql 报错 0xc000007b_docker插件部署项目,volumes报错invalid volume specification...

    关于idea使用docker插件部署项目,volumes报错invalid volume specification 观察volumes那行,没写错的.但是........ 使用docker-comp ...

  7. java web项目目录报错_netdevgirl.通过maven创建javaweb项目

    解决方法:右键工程-->Properties-->Project Facets,最面边的面板,选择Runtimes,选中tomcat服务."Apply"应用配置. 2 ...

  8. 解决JavaWeb项目代码报错

    解决JavaWeb项目代码报错 说明:JavaWeb项目代码报错的处理流程 处理流程 重新执行代码,避免上一次运行错误的影响 查看Tomcat报错信息 参考文章:idea中查看错误日志 如果是在ide ...

  9. 【若依(ruoyi)】解决同一Tomcat下两个/多个若依(ruoyi)项目部署报错

    前言 若依(ruoyi): v4.3 问题 同一Tomcat下部署两个/多个若依(ruoyi)项目会报错. 分析 若依(ruoyi)使用了druid,druid又使用了MBean. MBean要求,在 ...

最新文章

  1. windows 操作系统里 git bash 和 git cmd 的区别
  2. Datawhale组队-Pandas(下)文本数据(打卡)
  3. wordpress后台无法登录问题
  4. 电信网络拓扑图自动布局
  5. 【Git】GitHub for Windows使用(1)
  6. 一个...买裤子的全过程
  7. rbenv Your user account isn't allowed to install to the system Rubygems
  8. PHP往doc中插入图片
  9. linux命令 视频教程,常用的linux命令视频教程
  10. 【程序源代码】番茄时间小程序
  11. photoshopcs6快捷键
  12. eNSP华为模拟器使用——(11)eNSP模拟无线AC和AP
  13. gird布局(网格布局)
  14. 硬件防火墙和软件防火墙的比较
  15. 【SAP打印】SMARTFORMS标签无法调整横向打印
  16. 怎么把计算机里的文件放到桌面上,ipad怎么把文件放到桌面
  17. 实用一位加法电路-全加器(全加器真值表、全加器的逻辑组合电路)、几种基本组合逻辑电路真值表 补充:逻辑电路基础:与门、或门、非门----计算机组成原理
  18. JMeter Dummy sampler结果乱码 及 正则表达式提取器乱码的解决
  19. 物联网控制APP入门专题(五)---使用android studio直接编写物联网控制APP
  20. 学php收获与体会,实习心得体会及收获

热门文章

  1. VBA基础语法:取整函数
  2. python 论坛搭建_Python第一课 - python的开发环境的搭建
  3. JAVA中方法的调用(详细整理)
  4. Java B组蓝桥杯第六届国赛:铺瓷砖
  5. 计算机电缆选型,计算机电缆信号电缆如何选型?
  6. 到底怎样才可以顺利通过软考考试?
  7. 苹果系统和windows系统怎么切换_【电脑】在windows系统上安装苹果Mac系统
  8. RSA生成公钥与私钥
  9. go移植linux内核书名叫啥,嵌入式 Linux根文件系统移植之Linux文件系统简介-Go语言中文社区...
  10. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校运动会管理系统70suz