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ę?

tyczj
źródło

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>
Nadir Belhaj
źródło
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>
MrEngineer13
źródło
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>
Włodzimierz Kulyk
źródło
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.

V_J
źródło
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

Nasz Njoka Sr.
źródło
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>
Thirumalvalavan
źródło
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ć.

Prabhakaran
źródło
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ć.

S HemaNandhini
źródło
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>
Asim Roy
źródło
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

Kailash Dabhi
źródło
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.

Harry .Naeem
źródło
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
żywa miłość
źródło
4

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

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

Anirban
źródło
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>
Syed Hamza Hassan
źródło
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));

    }
yash sachdeva
źródło
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>
John Joe
źródło
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!

Gaurav Bhagat
źródło
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
Chinecherem Tina
źródło
-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>

`

Muhammad Ali
źródło
-2

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

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

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

Flowra
źródło
-2

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

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

Md. Ibrahim
źródło