กิจกรรมนี้มีแถบการกระทำที่จัดทำโดยการตกแต่งหน้าต่าง


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)

ดังนั้นฉันจึงเพิ่มสไตล์ของฉันเพื่อให้กิจกรรมของฉันไม่มี actionbar

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

และชุดรูปแบบนี้ใช้กับ activties ในรายการของฉัน

<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">

แต่ฉันยังคงได้รับข้อผิดพลาด ฉันยังไม่ขอคุณสมบัติหน้าต่างทุกที่ ความคิดใดที่ว่าทำไมฉันถึงได้รับสิ่งนี้

คำตอบ:


835

ฉันคิดว่าคุณกำลังพัฒนาสำหรับ 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 ดูที่แอตทริบิวต์ namespace ของแอปไม่ใช่แอนดรอยด์ สิ่งนี้ทำให้สามารถระบุแอตทริบิวต์ได้แม้ในแพลตฟอร์มที่ไม่มีอยู่ในตอนแรก มันเป็นวิธีที่ช่วยในการ backporting ของสิ่งต่าง ๆ เช่น colorPrimary
2557

4
เมื่อฉันเพิ่มบรรทัดนั้นในสไตล์ของฉันแอปขัดข้อง :(
rkmax

9
เพิ่ม <item name = "windowNoTitle"> จริง </item> หากคุณใช้ AppCompatActivity หลังจาก 22.1 สนับสนุนไลบรารีstackoverflow.com/a/29853299/1402525
Nick

4
อย่าลืมเพิ่ม: android: theme = "@ style / AppTheme" ลงในแท็กแอปพลิเคชันในไฟล์ Manifest
รักสด

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

หากต้องการใช้ Toolbar เป็นแถบการกระทำก่อนอื่นให้ปิดการใช้งานแถบการกระทำที่ตกแต่งไว้

วิธีที่ง่ายที่สุดคือการขยายธีมของคุณ

Theme.AppCompat.NoActionBar

(หรือตัวแปรแสง)

ประการที่สองสร้างอินสแตนซ์ของ Toolbar โดยปกติผ่าน 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 /> ในไฟล์เลย์เอาต์และทำอย่างนั้น! . ขอบคุณ
Andrew Irwin

22

หากคุณต้องการรวมกิจกรรมบางอย่างกับ actionbar และกิจกรรมอื่น ๆ ที่ไม่ใช่คุณควรใช้ชุดรูปแบบพื้นฐานเปิดใช้งาน actionbar แล้วสร้างชุดรูปแบบย่อยที่คุณจะใช้ในกิจกรรมที่ไม่ต้องใช้แถบเครื่องมือ

ตัวอย่างเช่นคุณสามารถใช้สไตล์ย่อยเช่นนี้

             <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

เพิ่มสิ่งนี้ในค่า / 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 เป็นเท็จ

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

13
คุณช่วยคนอื่นอย่างไรเมื่อคำตอบของคุณไม่ถูกต้องเกี่ยวกับคำถามของฉัน
tyczj

แทนการใช้ "Theme.AppCompat.Light" ให้ใช้ "Theme.AppCompat.Light.NoActionBar"
Christina

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

ใช้สิ่งนี้ภายในแท็กแอปพลิเคชันของคุณในรายการหรือภายในแท็กกิจกรรมของคุณ

หุ่นยนต์: ชุดรูปแบบ = "@ สไตล์ / AppTheme.NoActionBar"


3

หากคุณกำลังใช้Appcompactกิจกรรมให้ใช้สามบรรทัดในธีมของคุณ

<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
ที่สมบูรณ์แบบ! ขอบคุณสำหรับการแบ่งปัน.
Sandeep Yohans

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 -> values ​​-> styles

คุณสามารถดูวิดีโอนี้เพื่อความสะดวกมากขึ้นคลิกที่นี่

โซลูชันที่ 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">

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.