Android技能之-setSupportActionBar(toolbar)的那点事

伴随着Android的主题(theme)越来越多之后,记清如何使用以及怎么使用、使用后的效果如何,并非一件短时间里就能非常熟练的掌握好,那么关于主题中的ActionBar,今天这边做一个曾遇到的冲突记录

当我们选择创建一个Empty Activity的App项目时,默认生成的AndroidManifest.xml内容如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="xxx.xxx.xxx">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在这里,我们应该注意到默认的App主题为android:theme="@style/AppTheme"
那么今天的问题来了!
回忆到曾经某个项目因为嫌弃系统自带的Actionbar不符合需求之后,那么重定义就免不了了,在重定义使用Actionbar的时候,因使用了API接口setSupportActionBar(@Nullable Toolbar toolbar),导致引发异常崩溃

E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.itsdf07.app.mvp, PID: 26401
        "java.lang.RuntimeException: Unable to start activity ComponentInfo{com.itsdf07.app.mvp/com.itsdf07.app.mvp.main.MainActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead."
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3194)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302)
        at android.app.ActivityThread.-wrap12(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891)
        at android.os.Handler.dispatchMessage(Handler.java:108)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7425)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
        "Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead. "
        at android.support.v7.app.AppCompatDelegateImplV9.setSupportActionBar(AppCompatDelegateImplV9.java:204)
        at android.support.v7.app.AppCompatActivity.setSupportActionBar(AppCompatActivity.java:129)
        at com.itsdf07.app.mvp.main.MainActivity.onCreate(MainActivity.java:26)
        at android.app.Activity.performCreate(Activity.java:7372)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3147)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3302) 
        at android.app.ActivityThread.-wrap12(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1891) 
        at android.os.Handler.dispatchMessage(Handler.java:108) 
        at android.os.Looper.loop(Looper.java:166) 
        at android.app.ActivityThread.main(ActivityThread.java:7425) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921) 

什么原因呢?启动MainActivity界面失败,原因是
This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_SUPPORT_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.

这个Activity(也就是要启动的MainActivity)已经由 window decor提供了一个action bar,不需要重复请求 window的FEATURE_SUPPORT_ACTION_BAR,并且可以通过设置主题中的windowActionBar属性为false来代替它

为什么会这样呢?程序不能只看表面,既然异常提到了theme,那么我们就需要进一步往parent主题来定位原因,总能发现原因的

    <style name="Base.V7.Theme.AppCompat.Light" parent="Platform.AppCompat.Light">
        <item name="windowNoTitle">false</item>
        "<item name="windowActionBar">true</item>"
        <item name="windowActionBarOverlay">false</item>
        <item name="windowActionModeOverlay">false</item>
        <item name="actionBarPopupTheme">@null</item>
		......
    </style>

当看到上面的设置时,我们发现了<item name="windowActionBar">true</item>,也就是说当前所使用的主题其实是带了一个ActionBar的,这么一来,就好理解了,在已有ActionBar的基础上在添加一个ActionBar,出现冲突了,能排查出原因的问题,那就都不是问题。因为下面这个主题,就可以解决这个冲突

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

没带ActionBar的主题,我们想怎么添加新的ActionBar都可以!
当然,如果想要全局都使用自定义ActionBar,那么就直接在AndroidManifest.xmlapplication下的theme设置为无ActionBar即可,如android:theme="@style/AppTheme.NoActionBar",如果只是针对某个视图UI,那么 就针对那个Activity进行设置即可

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android应用开发》实验报告 实验序号:06         实验项目名称:利用导航图标实现层级式导航 "学  号" "姓  名" "专业、班 " " "实验地点" "指导教师" "实验时间 " " "实验目的及要求 " "(1)熟悉Eclipse集成环境的开发步骤; " "(2)了解如何实现层级式导航; " "(3)掌握如何利用导航图标实现层级式导航。 " "二、实验设备(环境)及要求 " "1、winXP虚拟机; " "2、Eclipse集成开发环境。 " "三、实验内容与步骤 " "(1)修改新建项目的res/layout目录下的布局文件activity_main.xml,将" "默认添加TextView组件删除,然后添加一个id为next的按钮,设置显示文字" "为"奋斗"; " "(2)在MainActivity的onCreat()方法中,获取布局文件中添加的按钮,并" "为其设置单击件监听器,实现启动另一个Activity功能; " "(3)创建详细页面Activity布局文件,名称为activity_detail.xml,在该" "文件中主要添加一个文本框组件,显示关于奋斗的详细信息; " "(4)创建DetailActivity,并重写它的onCreate()方法和onCreatOptionsM" "enu()方法,并且在onCreated()方法中,添加代码控制导航图标的显示; " "(5)重写onOptionsItemSelected()方法,实现通过调用NavUtils.getPare" "ntActivityName()方法;检查元数据是否指定了父Activity,如果指定,则" "调用navigateUpFromSameTask()方法导航至副Activity; " "(6)在AndroidManifest.xml中,使用<activity>标记的子标记<meta-data" ">配置Activity的父Activity " "(7)运行实例,查看实验结果。 " "四、程序调试(结果及分析) " " " "五、总结与体会 " "通过本次实验,知道了如何设计一个层级式导航,并设计导航栏返回按钮," "使得可以从子Activity返回到父Activity,安卓开发的能力更强了。 " "六、教师评语 "成绩 " "签名: " " "日期: " " 附关键代码: 1. Xml代码: 2. <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <androidx.appcompat.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> </com.google.android.material.appbar.AppBarLayout> <Button android:id="@+id/next" android:layout_width="100dp" android:layout_height="100dp" android:layout_marginTop="50dp" android:text="关于理想" /> 2. Acivity代码: public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); Button btn=(Button)findViewById(R.id.next); btn.setOnClickListener(new View.OnClickListener() { @

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值