To działanie ma już pasek akcji dostarczony przez dekorację okna


496

Próbuję przesuwać swoje rzeczy, aby użyć Toolbarzamiast paska akcji, ale ciągle pojawia się komunikat o błędzie

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)

więc dodałem w moim stylu, aby moja aktywność nie miała paska akcji

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

a temat dotyczy działań w moim manifeście

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

MainActivity rozszerza GooglePlayServiceActivity, więc również tam ustawiłem motyw

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

ale nadal pojawia się błąd. Nigdzie też nie żądam funkcji okna. jakieś pomysły, dlaczego wciąż to otrzymuję?

Odpowiedzi:


834

Myślę, że tworzysz dla Androida Lollipop, ale i tak dołącz tę linię:

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

do deklaracji motywu w twoim app/src/main/res/values/styles.xml.

Ponadto, jeśli korzystasz z AppCompatActivitybiblioteki pomocy technicznej w wersji 22.1 lub nowszej, dodaj ten wiersz:

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

Deklaracja motywu może wyglądać tak po tych wszystkich dodatkach:

<!-- 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
to windowActionBarnie to samo co android:windowActionBar?
tyczj

65
Tak, ale AppCompat sprawdza atrybuty przestrzeni nazw aplikacji, a nie Androida. Umożliwia to określenie atrybutu nawet na platformach, które go pierwotnie nie miały. W ten sposób pozwala na backportowanie takich rzeczy jak colorPrimary.
yarian

4
Kiedy dodałem tę linię do moich stylów, awaria aplikacji :(
rkmax

9
Dodaj także <item name = "windowNoTitle"> true </item> Jeśli używasz AppCompatActivity po obsłudze biblioteki 22.1 stackoverflow.com/a/29853299/1402525
Nick

4
Nie zapomnij dodać: android: theme = "@ style / AppTheme" do znacznika aplikacji w pliku manifestu.
live-love

202

Innym łatwym sposobem jest uczynienie z motywu takiego dziecka Theme.AppCompat.Light.NoActionBar:

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

Próbowałem też tej metody, ale nadal pojawia się błąd. Jednak mogło to być zanim ustawiłem temat na swój GooglePlayServiceActivity, nie pamiętam
tyczj

1
Tak, tego właśnie używałem. Upewnij się tylko, że działanie korzysta z tego motywu w manifeście
MrEngineer13,

6
Uważam to rozwiązanie za bardziej eleganckie niż rozwiązanie @Nadir Belhaj, chociaż oba są poprawne.
voghDev

Myślę, że to lepsza odpowiedź, użycie wbudowanego atrybutu XML (windowActionBar = false) nie działało - dostałem taki sam błąd jak @tyczj
Booger

W takim przypadku nie można użyć Theme.AppCompat.Light.DarkActionBar, który faktycznie jest użytecznym rodzicem.
f470071,

125

Dodać jedną linię android:theme="@style/AppTheme.NoActionBar"do activityw AndroidManifesti zrobiłeś.


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

Aby użyć paska narzędzi jako paska akcji, najpierw wyłącz pasek akcji dostarczony z dekoracją.

Najprostszym sposobem jest rozszerzenie motywu

Theme.AppCompat.NoActionBar

(lub jego lekki wariant).

Po drugie, utwórz instancję paska narzędzi Toolbar, zwykle poprzez układ 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” />

Następnie w swojej aktywności lub fragmencie ustaw pasek narzędzi, aby działał jako pasek akcji:

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

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

Ten kod działał dla mnie.


1
Dzięki! Zapomniałem dodać <android.support.v7.widget.Toolbardo XML.
CoolMind

1
Nie mogłem zrozumieć, dlaczego mój kolor paska narzędzi był po prostu pusty. Nie mogłem wymyślić, jak zmienić go na zielony. Czuję się głupio, ponieważ wszystko, co musiałem zrobić, to umieścić Androida: background = "" w pliku <android.support.v7.widget.Toolbar /> w pliku układu i tak się stało! . Dzięki
Andrew Irwin,

21

Jeśli chcesz połączyć niektóre działania z paskiem działania, a inne nie, powinieneś użyć motywu podstawowego z włączonym paskiem działania, a następnie utworzyć podtemat, który będzie używany w działaniach, które nie wymagają paska działań

Na przykład możesz użyć takiego stylu podrzędnego

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

Podczas gdy motyw podstawowy się rozszerza, powiedz

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

a następnie użyj motywu innego niż pasek akcji w pliku AndroidManifest w tagu aktywności

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

musisz to zastosować do każdego pojedynczego działania, które nie potrzebuje paska działań, więc jeśli twój projekt wymaga mniej działań paska działania niż nie, lepiej zastosować to na podstawowym poziomie motywu


12

Miałem również ten sam problem. Ale użyłem:

getSupportActionBar().hide();

przed

setContentView(R.layout.activity_main);

Teraz działa.

I możemy wypróbować inną opcję w 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

Dodaj to do swoich wartości / styles.xml

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

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

</style>

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

</style>

I dodaj następujący kod do wartości-v11 / styles.xml i wartości-v14 / styles.xml

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

</style>

Otóż ​​to. To będzie działać.


6

Musisz się zmienić

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

te linie w manifeście. Będzie to dla mnie idealnie działać.


5

Przejdź do „style.xml” swojego projektu i ustaw wartość windowActionBar na false

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

13
Jak pomagasz innym, gdy twoja odpowiedź jest nieprawidłowa w odniesieniu do mojego pytania
tyczj

Zamiast używać „Theme.AppCompat.Light”, użyj „Theme.AppCompat.Light.NoActionBar”
Christina

4

Dodaj dwie linie do motywu aplikacji w pliku 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

Dodałem pasek narzędzi do mojego xml. Następnie w swojej działalności dodałem następujące oświadczenie:

setSupportActionBar(toolbar);

Usunięcie tego działało dla mnie. Mam nadzieję, że to komuś pomoże.


Co jeśli nie chcę go usunąć? Oznacza to, że niektóre rzeczy używają paska narzędzi.
Sreekanth Karumanaghat

Nie jestem tego pewien, ale myślę, że usunięcie tego „setSupportActionBar (pasek narzędzi);” pasek narzędzi pozostanie tam.
Harry .Naeem

4

Jeśli pojawi się błąd w tym wierszu:

setSupportActionBar(...);

Musisz sprawdzić, czy twoja aktywność dotyczy motywu zawierającego pasek narzędzi. AppTheme aplikacji może już zawierać pasek narzędzi, taki jak

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

i próbujesz dodać drugi. Jeśli chcesz użyć aplikacji AppTheme, musisz usunąć motyw ze swojej aktywności, w pliku manifest.xml.

Na przykład:

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

4

Użyj tego w tagu aplikacji w manifeście lub w tagu aktywności.

android: theme = "@ style / AppTheme.NoActionBar"


3

Jeśli korzystasz z Appcompactdziałania, użyj tych trzech wierszy w swoim motywie.

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

2

Mówiąc najprościej, możesz wykonać następujące czynności:

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

W ten sposób rozwiązałem problem. Dodaj poniższy kod w swoimAndroidMainfest.xml

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

1
doskonały! Dzięki za udostępnienie.
Sandeep Yohans

1

Lub Po prostu zmień @ Style / AppTheme

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

To działa dla mnie!


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

Istnieją dwa proste i szybkie rozwiązania

przejdź do res -> wartości -> style

Możesz także obejrzeć ten film dla większej wygody KLIKNIJ TUTAJ

Rozwiązanie 1:

Możesz usunąć pasek akcji, zastępując go

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

do

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

Rozwiązanie 2:

Po prostu dodaj te linie

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

Twój plik stylu wygląda teraz tak

`

<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

Rozwiązałem to, usuwając tę ​​linię:

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

z właściwości aktywności w Manifest file


-2

Wystarczy umieścić parent="Theme.AppCompat.NoActionBar"plik style.xml

Lubić - <style parent="Theme.AppCompat.NoActionBar" name="AppTheme.NoActionBar">

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.