В этом действии уже есть панель действий, предоставляемая декором окна


497

Попытка переместить мои вещи для использования Toolbarвместо панели действий, но я получаю сообщение об ошибке

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tyczj.weddingalbum/com.xxx.xxx.MainActivity}: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5039)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.IllegalStateException: This Activity already has an action bar supplied by the window decor. Do not request Window.FEATURE_ACTION_BAR and set windowActionBar to false in your theme to use a Toolbar instead.
            at android.support.v7.app.ActionBarActivityDelegateBase.setSupportActionBar(ActionBarActivityDelegateBase.java:165)
            at android.support.v7.app.ActionBarActivity.setSupportActionBar(ActionBarActivity.java:92)
            at com.xxx.xxx.MainActivity.onCreate(MainActivity.java:113)
            at android.app.Activity.performCreate(Activity.java:5104)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5039)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

поэтому я добавил в своем стиле, чтобы в моей активности не было панели действий

<style name="AppCompatTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:windowActionBar">false</item>
</style>

и тема относится к активностям в моем манифесте

<activity
        android:name=".MainActivity"
        android:windowSoftInputMode="adjustResize|stateHidden"
        android:theme="@style/AppCompatTheme" android:screenOrientation="portrait"/>

MainActivity расширяет GooglePlayServiceActivity, поэтому я тоже установил там тему

<activity
       android:name=".GooglePlayServicesActivity"
       android:label="@string/title_activity_google_play_services"
       android:theme="@style/AppCompatTheme">

но я все еще получаю ошибку. Я также нигде не запрашиваю оконную функцию. есть идеи, почему я до сих пор это понимаю?

Ответы:


836

Я думаю, что вы разрабатываете для Android Lollipop, но в любом случае включить эту строку:

<item name="windowActionBar">false</item> 

к объявлению вашей темы внутри вашего app/src/main/res/values/styles.xml.

Кроме того, если вы используете AppCompatActivityбиблиотеку поддержки версии 22.1 или выше, добавьте эту строку:

<item name="windowNoTitle">true</item>

Объявление вашей темы может выглядеть так после всех этих дополнений:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
</style>

18
это windowActionBarне то же самое android:windowActionBar?
tyczj

65
Это так, но приложение AppCompat смотрит на атрибут пространства имен приложения, а не на Android. Это позволяет указать атрибут даже на платформах, у которых его изначально не было. Это то, как это позволяет делать бэкпорт таких вещей, как colorPrimary.
yarian

5
Когда я добавил эту строку в мои стили, приложение
перестало работать

9
Также добавьте <item name = "windowNoTitle"> true </ item> Если вы используете AppCompatActivity после 22.1, поддержка библиотеки stackoverflow.com/a/29853299/1402525
Ник

4
Не забудьте добавить: android: theme = "@ style / AppTheme" в тег приложения в файле манифеста.
живи-люби

202

Другой простой способ - сделать вашу тему дочерней Theme.AppCompat.Light.NoActionBarпримерно так:

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

Я тоже попробовал этот метод, но все равно получил ошибку. Как бы то ни было, прежде чем я задал тему GooglePlayServiceActivity, я не помню
tyczj

1
Да, это то, что я использовал. Просто убедитесь, что действие использует эту тему в манифесте
MrEngineer13

6
Я нахожу это решение более элегантным, чем решение @Nadir Belhaj, хотя оба они верны.
voghDev

Я думаю, что это лучший ответ, использование встроенного атрибута XML (windowActionBar = false) не сработало - я получил ту же ошибку, что и @tyczj
Booger

В этом случае вы не можете использовать Theme.AppCompat.Light.DarkActionBar, который на самом деле является полезным родителем.
f470071

125

Добавить одну строку , android:theme="@style/AppTheme.NoActionBar"чтобы activityв AndroidManifestи вы сделали.


AndroidManifest.xml :

<activity android:name=".activity.YourActivity"
          android:theme="@style/AppTheme.NoActionBar"><!-- ADD THIS LINE -->

styles.xml

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

52

Чтобы использовать панель инструментов в качестве панели действий, сначала отключите предоставленную декором панель действий.

Самый простой способ - расширить тему

Theme.AppCompat.NoActionBar

(или его легкий вариант).

Во-вторых, создайте экземпляр панели инструментов, обычно с помощью XML-макета:

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

Затем в своей деятельности или фрагменте установите панель инструментов в качестве панели действий:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.blah);

    Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
    setSupportActionBar(toolbar);
}

Этот код работал для меня.


1
Спасибо! Я забыл добавить <android.support.v7.widget.Toolbarв XML.
CoolMind

1
Я не мог понять, почему мой цвет панели инструментов был просто пустым. Не могу понять, как изменить его на зеленый. Я чувствую себя глупо, так как все, что мне нужно было сделать, это положить android: background = "" в <android.support.v7.widget.Toolbar /> в файле макета, и это сделало это! , Спасибо
Эндрю Ирвин

22

Если вы хотите объединить некоторые действия с панелью действий, а другие нет, вам следует использовать базовую тему с включенной панелью действий, а затем создать подтему, которую вы собираетесь использовать в действиях, для которых не требуется панель действий.

Например, вы можете использовать такой подстиль

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

В то время как базовая тема расширяется, скажем

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

а затем используйте тему без действия панели в файле AndroidManifest в теге активности скажем

   <activity
        android:name="com.example.NonActionBarActivity"
        android:theme="@style/AppTheme.NoActionBar"

Вы должны применить это к каждому отдельному действию, которое не нуждается в панели действий, поэтому, если ваш проект требует меньше действий панели действий, чем не, тогда лучше применить это на уровне базовой темы


12

Я также столкнулся с той же проблемой. Но я использовал:

getSupportActionBar().hide();

перед

setContentView(R.layout.activity_main);

Теперь это работает.

И мы можем попробовать другой вариант в Style.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>
    </style>

8

Добавьте это в ваши values ​​/ styles.xml

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

<style name="AppBaseTheme" parent="YourCustomTheme">

</style>

<style name="AppTheme" parent="AppBaseTheme">

</style>

И добавьте следующий код в ваши values-v11 / styles.xml и values-v14 / styles.xml

<style name="AppBaseTheme" parent="YourCustomTheme">

</style>

Это оно. Это будет работать.


6

Вам нужно изменить

  <activity
        android:name=".YOUR ACTIVITY"
        android:theme="@style/AppTheme.NoActionBar" />
</application>`

эти строки в манифесте. Это будет отлично работать для меня.


5

Перейдите в style.xml вашего проекта и установите windowActionBar в false

<style name="AppCompatTheme" parent="@style/Theme.AppCompat.Light">
        <item name="android:windowActionBar">false</item>
</style>

13
Как вы помогаете другим, когда ваш ответ неверен в отношении моего вопроса
tyczj

Вместо того, чтобы использовать «Theme.AppCompat.Light», используйте «Theme.AppCompat.Light.NoActionBar»
Кристина

4

Добавьте эти две строки в тему вашего приложения, расположенную в style.xml: -

 <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    //Add this two line will fix your problem
    <item name="windowNoTitle">true</item>   <--1(this applies after 22.0.1 support library i think 
    <item name="windowActionBar">true</item> <--2


4

Мне добавили панель инструментов в мой XML. Затем в своей деятельности я добавил это утверждение:

setSupportActionBar(toolbar);

Удаление этого сработало для меня. Надеюсь, это кому-нибудь поможет.


Что если я не хочу его удалять? То есть есть вещи, которые используют панель инструментов.
Sreekanth Karumanaghat

Я не уверен в этом, но я думаю, что удаление этого "setSupportActionBar (панель инструментов);" панель инструментов останется там.
Гарри. Наим

4

Если вы получили ошибку в этой строке:

setSupportActionBar(...);

Вы должны проверить, относится ли ваша деятельность к теме, содержащей панель инструментов. AppTheme вашего приложения может уже содержать панель инструментов, такую ​​как

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

и вы пытаетесь добавить второй. Если вы хотите использовать AppTheme вашего приложения, вам нужно удалить тему из вашей деятельности в файле manifest.xml.

Например:

<activity
    android:name=".ui.activities.SettingsActivity"
    android:theme="@style/AppTheme1" /> --> remove this theme

4

Используйте это внутри тега приложения в манифесте или внутри тега Activity.

Android: тема = "@ стиль / AppTheme.NoActionBar"


3

Если вы используете AppcompactActivity, используйте эти три строки в своей теме.

<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="android:windowActionBarOverlay">false</item>

2

Проще говоря, вы можете сделать следующее: -

if (android.os.Build.VERSION.SDK_INT >= 21) {
        Window window = getWindow();
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));

    }

2

Вот как я решил проблему. Добавьте ниже код в вашемAndroidMainfest.xml

<activity android:name=".YourClass"
            android:theme="@style/Theme.AppCompat.Light.NoActionBar">
 </activity>

1
идеально! Спасибо, что поделился.
Сандип Йоханс

1

Или просто измените @ Style / AppTheme

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">

Это работает для меня!


0
 <style name="AppCompatTheme" parent="@style/Theme.AppCompat.Light">
            <item name="android:windowActionBar">false</item>
    </style>

    Change this to NoActionBar 

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

        </style>

    This one worked for me

-1

Есть два простых и быстрых решения

перейти к res -> значения -> стили

Вы также можете посмотреть это видео для большей легкости НАЖМИТЕ ЗДЕСЬ

Решение 1:

Вы можете удалить панель действий, заменив

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

в

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

Solution2:

Просто добавьте эти строки

<item name="windowActionBar">false</item> <item name="windowNoTitle">true</item>

Итак, теперь ваш файл стиля выглядит следующим образом

`

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>

</style>

`


-2

Я решил это, удалив эту строку:

android:theme="@style/Theme.MyCompatTheme"

от свойств деятельности в Manifest file


-2

Просто положи parent="Theme.AppCompat.NoActionBar" в свой файл style.xml

Подобно - <style parent="Theme.AppCompat.NoActionBar" name="AppTheme.NoActionBar">

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.