Androidスキルの-setSupportActionBar(toolbar)の件

20166 ワード

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>
        "">true"
        <item name="windowActionBarOverlay">false</item>
        <item name="windowActionModeOverlay">false</item>
        <item name="actionBarPopupTheme">@null</item>
		......
    </style>

上記の設定を見て、trueを発見しました.つまり、現在使用されているテーマは実際に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に設定すればよい.