คุณต้องใช้ธีม Theme.AppCompat (หรือลูกหลาน) กับกิจกรรมนี้


1004

Android Studio 0.4.5

เอกสารประกอบ Android สำหรับการสร้างกล่องโต้ตอบแบบกำหนดเอง: http://developer.android.com/guide/topics/ui/dialogs.html

หากคุณต้องการไดอะล็อกที่กำหนดเองคุณสามารถแสดงกิจกรรมเป็นไดอะล็อกแทนที่จะใช้ไดอะล็อก API เพียงสร้างกิจกรรมและกำหนดธีมเป็น Theme.Holo.Dialog ใน<activity>องค์ประกอบรายการ:

<activity android:theme="@android:style/Theme.Holo.Dialog" >

อย่างไรก็ตามเมื่อฉันลองทำสิ่งนี้ฉันจะได้รับข้อยกเว้นดังนี้:

java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity

ฉันสนับสนุนสิ่งต่อไปนี้และฉันไม่สามารถใช้บางอย่างที่มากกว่า 10 สำหรับนาที:

minSdkVersion 10
targetSdkVersion 19

ในรูปแบบของฉันฉันมีดังต่อไปนี้:

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

และในรายการของฉันฉันมีสิ่งนี้สำหรับกิจกรรม:

 <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:theme="@android:style/Theme.Holo.Light.Dialog"
            android:name="com.ssd.register.Dialog_update"
            android:label="@string/title_activity_dialog_update" >
        </activity>

การสร้างกล่องโต้ตอบแบบนี้เป็นสิ่งที่ฉันอยากทำเพราะฉันได้ทำเลย์เอาต์เสร็จแล้ว

ใครสามารถบอกฉันได้ว่าฉันจะแก้ไขปัญหานี้ได้อย่างไร


2
@ Raghunandan ฉันยังใหม่กับสิ่งนี้ แต่ดูที่สไตล์ของฉันฉันมีดังต่อไปนี้: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> และฉันมีการนำเข้าต่อไปนี้: import android.support.v7 .app.ActionBarActivity; นำเข้า android.support.v7.app.ActionBar; นำเข้า android.support.v4.app.Fragment; แต่ไม่แน่ใจว่าสิ่งทั้งหมดนี้หมายถึงอะไร
ant2009

10
คุณกำลังใช้AppCompatซึ่งเป็นรูปแบบห้องสมุดสนับสนุนเพื่อสนับสนุนแถบแอ็คชั่นด้านล่าง api ระดับ 11 เพียงใช้android:theme="@style/AppTheme" >สำหรับกิจกรรมในรายการ
Raghunandan

2
@ ant2009 เพื่อจัดลำดับสิ่งที่ @Raghunandan กล่าวไว้: ในAndroidManifest.xmlธีมของคุณที่คุณระบุไว้สำหรับกิจกรรมของคุณคือการแทนที่ธีมที่คุณระบุสำหรับแอปพลิเคชันของคุณ ลบandroid:themeบรรทัดออกจาก<activity>แท็ก
cryptochronoconolite

3
การทำเช่นนี้จะลบข้อผิดพลาด แต่ไม่ให้เขาไปยังที่ที่เขาต้องการซึ่งเป็นกิจกรรมที่มีธีมการโต้ตอบ กฎทั่วไปคือถ้าคุณต้องการให้กิจกรรมของคุณมีแถบแอ็คชันควรมีธีม AppCompat และโค้ดจาวาควรขยาย ActionBarActivity หากคุณมีกิจกรรมที่ไม่ต้องการแถบการกระทำ (เช่นกิจกรรมที่มีธีมโต้ตอบ) คุณสามารถใช้ชุดรูปแบบใดก็ได้ แต่โค้ด java ต้องขยายกิจกรรมเก่าแบบธรรมดา
Bobbake4

1
ฉันคิดว่าปัญหาเดียวในกรณีนี้คือบริบทที่คุณกำหนดสำหรับ Dialog constractor ดูคำตอบของฉัน stackoverflow.com/a/51574281/232727
Vitaliy A

คำตอบ:


1124

เหตุผลที่คุณมีปัญหานี้คือเนื่องจากกิจกรรมที่คุณพยายามใช้ธีมไดอะล็อกที่จะขยายActionBarActivityซึ่งต้องใช้AppCompatชุดรูปแบบ

อัปเดต : การขยาย AppCompatActivityจะมีปัญหานี้ด้วย

ในกรณีนี้ให้เปลี่ยนการสืบทอด Java จากActionBarActivityเป็นActivityและปล่อยให้ธีมโต้ตอบในรายการตามที่มันเป็นTheme.AppCompatค่าที่ไม่ใช่


กฎทั่วไปคือว่าถ้าคุณต้องการรหัสของคุณให้การสนับสนุนรุ่นเก่าของ Android ก็ควรจะมีรูปแบบและรหัสจาวาควรขยายAppCompat AppCompatActivityถ้าคุณมี * กิจกรรมที่ไม่ต้องการการสนับสนุนนี้เช่นคุณเท่านั้นที่ดูแลเกี่ยวกับรุ่นล่าสุดและคุณสมบัติของ Android ของคุณสามารถใช้รูปแบบใด ๆ ไป Activityแต่รหัสจาวาต้องขยายธรรมดาเก่า


หมายเหตุ: เมื่อเปลี่ยนจากAppCompatActivity(หรือคลาสย่อยActionBarActivity) เป็นเป็นActivityต้องเปลี่ยนการโทรต่าง ๆ ด้วย "support" เป็นการโทรที่สอดคล้องกันโดยไม่มี "support" ดังนั้นแทนที่จะโทรgetSupportFragmentManagergetFragmentManager


6
op กำลังใช้ appcompat ซึ่งในกรณีที่เขาควรขยายActionBarActivityซึ่งเป็นสิ่งที่แสดงจากคำสั่งนำเข้าของเขาจากความคิดเห็นด้านล่าง quesiton
Raghunandan

2
@Bursos หากคุณกำลังพูดถึงเมื่อคุณสร้างโครงการใหม่ใน Android Studio ฉันเดาว่านี่เป็นข้อผิดพลาดในการกำหนดค่ามาตรฐาน
Bobbake4

2
@ Bobbake4 ฉันมีปัญหาเดียวกันและวิธีนี้เป็นไปไม่ได้สำหรับฉัน สิ่งหนึ่งคือฉันไม่สามารถขยายกิจกรรมได้เพราะฉันมีคลาสจำนวนมาก (โครงการทั้งหมด) ที่ถ่ายทอดบน ActionBarActivity มีวิธีแก้ไขปัญหาอื่นอีกหรือไม่? ขอบคุณ
5er

6
@ 5er หาก Java ของคุณใช้ ActionBarActivity ธีมจะต้องขยาย Theme.AppCompat มีอยู่ไม่กี่ตัวในชุดรูปแบบที่จะขยาย Theme.AppCompat หรือคุณสามารถขยายตัวเองและปรับเปลี่ยนมัน ActionBarActivity โดยไม่ต้องลบพาเรนต์ของ ActionBarActivity ออกไปคุณจะไม่สามารถใช้ Theme.AppCompat ได้
Bobbake4

26
ในสไตล์ <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> สิ่งนี้สามารถแก้ไขปัญหาของฉันได้ :)
Harmeet Singh

545

สิ่งที่คุณต้องทำคือเพิ่มandroid:theme="@style/Theme.AppCompat.Light"ไปยังแท็กแอปพลิเคชันของคุณในAndroidManifest.xmlไฟล์


2
ในรหัส ant2009 ได้ตั้งค่า AppTheme เป็นแอปพลิเคชันซึ่งขยายมาจากลูกหลานของ Theme.AppCompat ว่าควรจะทำงาน ฉันมีปัญหาเดียวกันหลังจากอัปเกรดเป็น 5.0 บนอุปกรณ์ของฉันและสิ้นสุดการตั้งค่า @ style / Theme.AppCompat.Light เป็นธีมของกิจกรรมของฉัน มีบางอย่างไม่ถูกต้องที่นี่ ...
speedynomads

36
นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับ Android Studio ถึงแม้ว่าในบางกรณีจะสามารถแก้ไขได้อย่างรวดเร็วเมื่อมีการข้ามไฟล์ styles.xml ใน Android Studio วิธีที่เหมาะสมในการกำหนดธีมคือการกำหนดในไฟล์ styles.xml จากนั้นไฟล์ Menifest ของ Android จะอ้างถึงพวกเขาและเลือกธีมตามรุ่น Android ที่คุณใช้บนอุปกรณ์ของคุณ โดยปกติแล้วมันจะถูกตั้งค่าเป็น Android: theme = "@ style / AppTheme" และ AppTheme นี้อ้างถึง <style name = "Theme.AppTheme" parent = "Theme.AppCompat.Light"> ใน styles.xml
zeeshan

5
สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะแถบชื่อเรื่องของฉันหายไปเมื่อฉันใช้อะไรนอกจาก holo ...
AndyD273

1
พบกับปัญหานี้เช่นกันโดยใช้ SnackBar นี่เป็นการแก้ไขปัญหาของฉัน
ทำงาน

2
@ มาร์ตินถ้าคุณเป็นเหมือนฉันคุณลืมเพิ่มชื่อสไตล์เดียวกันในไฟล์ทั่วไป styles.xml มากกว่าที่คุณใส่ในไฟล์ (V21) styles.xml (โดยไม่มีคุณสมบัติเฉพาะสำหรับ V21) หากคุณประกาศสไตล์ในโฟลเดอร์ V21 และอุปกรณ์ของคุณมีรุ่นด้านล่าง ไม่พบมันดังนั้นจึงมีข้อยกเว้นเกิดขึ้น
letroll

275

คัดลอกคำตอบจาก @MarkKeen ในความคิดเห็นด้านบนเนื่องจากฉันมีปัญหาเดียวกัน

ฉันพบข้อผิดพลาดที่ด้านบนของโพสต์และเกิดขึ้นหลังจากฉันเพิ่มกล่องโต้ตอบการแจ้งเตือน ฉันมีข้อมูลสไตล์ทั้งหมดที่เกี่ยวข้องในไฟล์ Manifest ปัญหาของฉันหายโดยการเปลี่ยนการอ้างอิงบริบทในตัวสร้างการแจ้งเตือน - ฉันเปลี่ยน:

new android.support.v7.app.AlertDialog.Builder(getApplicationContext())

ถึง:

new android.support.v7.app.AlertDialog.Builder(this)

และไม่มีปัญหาอีกต่อไป


5
มันเกิดขึ้นกับฉันด้วย ฉันแค่พยายามและคำตอบของคุณใช้ได้จริง ๆ ! อะไรคือเหตุผลที่ทำให้การทำงานเป็นเช่นนี้? ฉันไม่เข้าใจจริงๆ
kirtan403

6
หรือถ้าคุณกำลังสร้าง AlertDialog ของคุณเป็นส่วน ๆ แทนที่จะเป็นโดยตรงในกิจกรรมให้ใช้getActivity()มากกว่าthisที่แนะนำข้างต้นและปัญหาได้รับการแก้ไขแล้ว สำหรับสาเหตุที่ฉันสามารถคาดเดารหัส AlertDialog.Builder (xxx) ที่เก่ากว่าได้เพียงต้องการประเภทที่แตกต่างกันเท่านั้น เนื่องจาก Google ได้เลือกที่จะซ่อน (ลบ?) เอกสารสำหรับรหัสเก่าซึ่งสันนิษฐานว่าเป็นความพยายามในการสนับสนุนการใช้เวอร์ชัน v7.app ฉันจึงรู้ว่าไม่มีทางที่จะบอกได้อย่างแน่นอน
แอนน์กันน์

ไม่ตรงข้ามกับสิ่งที่แนะนำ และมันก็ใช้งานได้: พี ขอบคุณ!
Harisewak

1
วิธีนี้จะแก้ปัญหาโปรแกรมสำหรับฉันคุณจะใช้getContext()แทนthisถ้าคุณอยู่ใน ArrayAdapter หรืออะแดปเตอร์คลาสที่คล้ายกัน
Ibrahim.H

1
นี่คือทางออกที่แท้จริงที่ฉันเคยพบ เคล็ดลับ: โปรดพูดถึงความแตกต่างใน getApplicationContext () และสิ่งนี้ในวัตถุประสงค์นี้
prazeev

109

min sdk คือ 10 ActionBarสามารถใช้ได้จาก api ระดับ 11 ดังนั้นสำหรับ 10 คุณจะใช้AppCompatจากไลบรารีการสนับสนุนที่คุณต้องการใช้Theme.AppCompatหรือลูกหลานของเดียวกัน

ใช้

android:theme="@style/Theme.AppCompat" >

หรือถ้าคุณไม่ต้องการแถบการกระทำที่ด้านบน

android:theme="@style/Theme.AppCompat.NoActionBar">

ข้อมูลเพิ่มเติม @

http://developer.android.com/guide/topics/ui/actionbar.html

แก้ไข:

ฉันอาจมีการโพสต์ op ที่ผิดพลาด

ดูเหมือนว่า op ต้องการไดอะล็อกที่มีธีมกิจกรรม ดังนั้นตามที่แนะนำแล้วโดย Bobbake4 ขยายแทนActivityActionBarActivity

นอกจากนี้ยังมีแอททริบิวของ Look @ Dialog ในลิงค์ด้านล่าง

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4_r1/frameworks/base/core/res/res/values/themes.xml/


ขอบคุณสำหรับคำแนะนำ ฉันลองแล้วที่จริงแล้ว และฉันก็มีปัญหาเดียวกัน ไฟล์สไตล์ของฉันมีลักษณะดังนี้: <style name = "AppTheme" parent = "Theme.AppCompat">
ant2009

@ ant2009 คุณจะไม่ ใช้ชุดรูปแบบจาก AppCompat ไลบรารีสนับสนุนสำหรับกิจกรรมของคุณ
Raghunandan

ฉันไม่แน่ใจว่าฉันกำลังเพิ่มชุดรูปแบบนี้ถูกต้องหรือไม่ แต่คุณหมายถึงการเพิ่มคำสั่งนำเข้าต่อไปนี้หรือไม่ นำเข้า android.support.v7.appcompat. *; อย่างไรก็ตามฉันลองและอาจผิดเพราะฉันยังคงจบลงด้วยข้อยกเว้นเดียวกัน
ant2009

@ ant2009 คุณสามารถมีไดอะล็อกที่กำหนดเองได้ แต่คุณต้องการโต้ตอบแบบเต็มหน้าจอ?
Raghunandan

ฉันไม่ต้องการให้เต็มหน้าจอ เพียงแค่กล่องโต้ตอบ อย่างไรก็ตามปัญหาได้รับการแก้ไขแล้ว Bobbake4 ทำให้ถูกต้อง ขอบคุณสำหรับความพยายามของคุณอย่างไรก็ตามคุณได้ให้คำแนะนำที่เป็นประโยชน์ อย่างไรก็ตามฉันยังสับสนกับไลบรารี่และ AppCompat ทั้งหมดนี้
ant2009

99

หากคุณใช้บริบทแอปพลิเคชันเช่นนี้:

final AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());

เปลี่ยนเป็นบริบทกิจกรรมเช่นนี้:

final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);

เช่นเดียวกันถ้าคุณใช้ LayoutInflater.from (<aplication บริบท>) ตรวจสอบให้แน่ใจว่าคุณใช้บริบทของกิจกรรมหรือ LayoutInflater ที่ให้มาเพื่อให้สืบทอดธีมที่ถูกต้อง
lbarbosa

1
ทางออกของคุณช่วยฉันในกรณีของฉัน คุณช่วยอธิบายความแตกต่างระหว่าง getApplicationContext () และ MainActivity.this ได้ไหม?
kostyabakay

อ้างถึงลิงค์นี้: stackoverflow.com/questions/22966601/…
Darush

9
คุณต้องการกิจกรรมที่ไม่บริบทเพื่อไดอะล็อกจอแสดงผล
behelit

วิธีนี้แก้ปัญหาได้
Mohamed Amin

45

ฉันประสบปัญหานี้แม้ว่าชุดรูปแบบของฉันเป็นAppCompatชุดรูปแบบและกิจกรรมของฉันเป็นAppCompatActivity(หรือActivityตามคำแนะนำของผู้อื่น) ดังนั้นฉันจึงทำความสะอาดสร้างใหม่และรันโครงการอีกครั้ง

( Build -> Clean Project; Build -> Rebuild Project; Run -> Run )

มันอาจดูเป็นใบ้ แต่ตอนนี้มันใช้งานได้ดี !

หวังว่ามันจะช่วยได้!


1
มีข้อความเดียวกันแน่นอนหลังจากเพิ่ม DialogFragment ในกิจกรรม AppCompat ไฟล์, ใช้งานแคช / รีสตาร์ทไม่ถูกต้องได้รับการแก้ไขในไม่ช้า
halxinate

2
ฉันพยายามตอบเกือบทั้งหมดในกระทู้นี้ แต่มีเพียงคำตอบที่ "โง่" ที่ดูเหมือนจะใช้ได้ ขอบคุณ!
Dika

27

นี่คือสิ่งที่แก้ไขให้ฉัน: แทนที่จะระบุธีมในรายการฉันได้กำหนดไว้ในonCreateแต่ละกิจกรรมที่ขยายActionBarActivity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.MyAppTheme);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_activity_layout);
...
}

นี่MyAppThemeคือการสืบทอดTheme.AppCompatและถูกกำหนดใน xml ทราบว่ารูปแบบจะต้องตั้งค่าก่อนและsuper.onCreatesetContentView


1
Robolectric กำลังขว้าง NullPointerException ที่บรรทัด setTheme เมื่อพยายามโหลดทรัพยากร มีความคิดอะไรบ้าง
Rhys Davis

@RhysDavis ยากที่จะพูดโดยไม่มีร่องรอยการติดตาม แต่บางทีมันอาจต้องการ setContentView เป็นอันดับแรก ในกรณีนี้การแก้ไขนี้จะไม่ทำงานสำหรับคุณ
k29

19

ไปที่สไตล์ของคุณและใส่แม่

parent="Theme.AppCompat"

แทน

parent="@android:style/Theme.Holo.Light"

ทำไมเราถึงทำสิ่งนี้กับกิจกรรมมาตรฐาน Android ไม่ได้ใส่แถบการกระทำในกิจกรรมมาตรฐานด้วย ICS หรือ Honecomb หรือไม่? เราจำเป็นต้องใช้ ActionBarActivity หรือไม่หากเราตั้งค่าเป้าหมายขั้นต่ำเป็น SDK ICS
Andrew S

วิธีการดูชุดรูปแบบที่เราควรใช้กับประเภทหรือคุณสมบัติที่เราใช้เพราะเมื่อเรานำเข้าเรามีชุดรูปแบบทุกประเภทที่ใช้ได้
blackHawk

16

ในกรณีของฉันฉันไม่มีไฟล์ values-v21 ในไดเรกทอรี res ของฉัน จากนั้นฉันก็สร้างมันขึ้นมาและเพิ่มเข้าไปในรหัสต่อไปนี้

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

ฉันใช้งานโครงการของฉันบนอุปกรณ์ Oreo + และสิ่งนี้ใช้ได้สำหรับฉันเท่านั้น
Nishant Soni

16

เปลี่ยนธีมของกิจกรรมที่ต้องการ สิ่งนี้ใช้ได้กับฉัน:

<activity
            android:name="HomeActivity"
            android:screenOrientation="landscape"
            android:theme="@style/Theme.AppCompat.Light"
            android:windowSoftInputMode="stateHidden" />

14

ฉันมีความผิดพลาดดังกล่าวในซัมซุงอุปกรณ์แม้ว่ากิจกรรมได้ใช้Theme.AppCompat สาเหตุหลักเกี่ยวข้องกับการปรับแต่งแปลก ๆ ในด้านของ Samsung:

- if one activity of your app has theme not inherited from Theme.AppCompat
- and it has also `android:launchMode="singleTask"`
- then all the activities that are launched from it will share the same Theme

โซลูชันของฉันเพิ่งลบ android:launchMode="singleTask"


2
เพิ่งพบปัญหานี้เช่นกันฉันไม่ได้ตรวจสอบการแก้ไขและไม่สามารถทำซ้ำข้อผิดพลาดได้ แต่ฉันเห็นข้อผิดพลาดนี้ในอุปกรณ์ซัมซุงเท่านั้น ดูเหมือนว่าส่วนใหญ่จะถูกหยั่งรู้เช่นกัน fwiw
danb

ฉันพบข้อผิดพลาดที่ด้านบนของโพสต์และเกิดขึ้นหลังจากฉันเพิ่มกล่องโต้ตอบการแจ้งเตือน ฉันมีข้อมูลสไตล์ทั้งหมดที่เกี่ยวข้องในไฟล์ Manifest ปัญหาของฉันหายโดยการเปลี่ยนการอ้างอิงบริบทในตัวสร้างการแจ้งเตือน - ฉันเปลี่ยน: new android.support.v7.app.AlertDialog.Builder (getApplicationContext ()) เป็น: new android.support.v7.app.AlertDialog.Builder (สิ่งนี้ ) และไม่มีปัญหาอีกต่อไป ...
Mark Keen

คุณมีรายละเอียดเพิ่มเติมหรือลิงค์ไปยัง samsung เกี่ยวกับการเพิ่มประสิทธิภาพนี้หรือไม่? ทำกิจกรรมทั้งหมดแล้วต้องใช้ Theme.AppCompat หรืออาจมีกิจกรรมที่ไม่มีธีมหรือไม่?
AAverin

13

หากคุณต้องการขยาย ActionBarActivity ที่คุณต้องการใน style.xml ของคุณ:

<!-- Base application theme. -->
<style name="AppTheme" parent="AppTheme.Base"/>

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

หากคุณตั้งค่าเป็นธีมหลักของแอปพลิเคชันของคุณเป็น android: Theme.Material.Light แทนAppTheme.Baseคุณจะได้รับข้อผิดพลาด“ IllegalStateException: คุณต้องใช้ธีม Theme.AppCompat (หรือลูกหลาน) กับกิจกรรมนี้”


13

แค่ทำ

new AlertDialog.Builder(this)

แทน

new AlertDialog.Builder(getApplicationContext())

วิธีแก้ปัญหาการทำงาน! เพื่อค้นหาคำตอบนี้ 30 นาที ทำไมฉันถึงใช้ AlertDialog.Builder ใหม่ (getApplicationContext ())?
Erich García

มันจะมีประโยชน์ในการอธิบายประเภทที่thisคาดว่าจะเป็น
Blago

12

ฉันมีปัญหาเดียวกัน แต่แก้ไขได้เมื่อฉันวางสิ่งนี้ไว้ในรายการ: android: theme = "@ style / Theme.AppCompat

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon"
        android:label="@string/app_name_test"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat">

        ...    

    </application>

10

ในกรณีของฉันปัญหาดังกล่าวปรากฏขึ้นเมื่อฉันพยายามแสดงไดอะล็อก ปัญหาเกิดขึ้นในบริบทฉันใช้getBaseContext ()ซึ่งในทางทฤษฎีควรส่งคืนบริบทของกิจกรรม แต่ไม่ปรากฏขึ้นหรือกลับบริบทก่อนที่จะใช้ชุดรูปแบบใด ๆ

ดังนั้นฉันเพิ่งแทนที่getBaseContexts ()ด้วย " this " และตอนนี้ก็ทำงานได้ตามที่คาดไว้

        Dialog.showAlert(this, title, message,....);

ฉันผ่าน getApplicaitonContext () แต่คุณทำเคล็ดลับได้แล้ว
Jeeva

9

ฉันมีกิจกรรมที่มีชุดรูปแบบที่<android:theme="@android:style/Theme.Dialog">ใช้สำหรับแสดงข้อความโต้ตอบในappWidgetของฉันและฉันมีปัญหาเดียวกัน

ฉันแก้ไขข้อผิดพลาดนี้โดยการเปลี่ยนรหัสกิจกรรมด้านล่าง:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}

2
นี่เป็นคำตอบที่ตรงไปตรงมาสำหรับฉันที่ไม่มีความซับซ้อนและไม่ใช่คำตอบของคำตอบที่ยอมรับ
Cory Trese


8

ตรวจสอบให้แน่ใจว่าคุณกำลังใช้บริบทของกิจกรรมในขณะที่สร้างกล่องโต้ตอบการแจ้งเตือนใหม่ไม่ใช่บริบทของแอปพลิเคชันหรือฐาน


7

ฉันมีปัญหานี้เช่นกันและสิ่งที่ฉันทำเพื่อแก้ไขและยังคงใช้ธีม Holo คือทำตามขั้นตอนเหล่านี้:

ก่อนอื่นฉันแทนที่การนำเข้านี้:

import android.support.v7.app.AppCompatActivity;

ด้วยอันนี้:

import android.app.Activity;

จากนั้นเปลี่ยนนามสกุลของฉันจาก:

public class MyClass extends AppCompatActivity {//...

สำหรับสิ่งนี้:

public class MyClass extends Activity {//...

และก็ต้องเปลี่ยนการนำเข้านี้:

import android.support.v7.app.AlertDialog;

การนำเข้านี้:

import android.app.AlertDialog;

จากนั้นคุณสามารถใช้แท็กชุดรูปแบบในรายการที่ระดับกิจกรรม:

android:theme="@android:style/Theme.Holo.Dialog" />

และสุดท้าย (เว้นแต่คุณจะมีคลาสอื่นในโครงการที่ต้องใช้ v7 appCompat) คุณสามารถล้างและสร้างโครงการของคุณใหม่หรือลบรายการนี้ในไฟล์ build gradle ที่ระดับแอป:

compile 'com.android.support:appcompat-v7:23.2.1'

หากคุณมีคลาสอื่นในโครงการของคุณที่ต้องใช้ v7 appCompat ให้ล้างและสร้างโครงการใหม่


6

คุณมาที่นี่เพราะคุณต้องการใช้การออกแบบวัสดุในสไตล์ธีมของคุณในเวอร์ชัน sdk ก่อนหน้านี้ถึง 21. ActionBarActivityต้องการAppThemeดังนั้นหากคุณต้องการป้องกันการปรับแต่ง AppTheme ของคุณเองคุณต้องเปลี่ยน style.xml ของคุณเท่านั้น (ก่อนหน้า ถึง sdk 21) ด้วยวิธีนี้คุณสามารถสืบทอดธีมแอพที่เข้ากันได้

<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">

สำหรับสิ่งนี้:

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

6
ทำอย่างนั้น ยังคงมีปัญหา ดังนั้นมีมากกว่านั้น
Martin

6

เปลี่ยนพาเรนต์ของธีมของธีมเป็น

 parent="Theme.AppCompat"

สิ่งนี้ใช้ได้กับฉัน ...


6

คุณมีวิธีแก้ไขข้อผิดพลาดมากมาย

  1. คุณควรใช้กิจกรรมหรือFragmentActivityแทนActionbarActivityหรือAppCompatActivity

  2. ถ้าคุณต้องการใช้ActionbarActivityหรือAppCompatActivityคุณควรเปลี่ยนในstyles.xml Theme.Holo.xxxxเป็นTheme.AppCompat.Light (หากจำเป็นต้องเพิ่มDarkActionbar )

หากคุณไม่จำเป็นต้องมีคุณลักษณะขั้นสูงเกี่ยวกับการดำเนินการบาร์หรือAppCompatคุณไม่จำเป็นต้องใช้ActionbarหรือAppCompat


6

ในรายการแอนดรอยด์เพียงเปลี่ยนธีมของกิจกรรมเป็น AppTheme ดังตัวอย่างโค้ด

<activity
  android:name=".MainActivity"
  android:label="@string/app_name"
  android:theme="@style/AppTheme">
</activity>

<activity android: name = ". MainActivity" android: label = "@ string / app_name" android: theme = "@ style / AppTheme"> </activity>
shikha

6

นี่คือเมื่อคุณต้องการ AlertDialog ในส่วน

            AlertDialog.Builder adb = new AlertDialog.Builder(getActivity());
            adb.setTitle("My alert Dialogue \n");
            adb.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                  //some code

            } });
            adb.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                 dialog.dismiss();

                } });
            adb.show();

6

จากประสบการณ์ของฉันปัญหาคือบริบทที่ฉันแสดงบทสนทนาของฉัน ภายในคลิกปุ่มฉันยกตัวอย่าง AlertDialog ด้วยวิธีนี้:

builder = new AlertDialog.Builder(getApplicationContext());

แต่บริบทไม่ถูกต้องและทำให้เกิดข้อผิดพลาด ฉันเปลี่ยนมันโดยใช้บริบทแอปพลิเคชันด้วยวิธีนี้:

ในส่วนประกาศ:

Context mContext;

ในวิธีการ onCreate

mContext = this;

และสุดท้ายในรหัสที่ฉันต้องการ AlertDialog:

start_stop = (Button) findViewById(R.id.start_stop);
start_stop.setOnClickListener( new View.OnClickListener()
     {
                @Override
                public void onClick(View v)
                {
                    if (!is_running)
                    {
                        builder = new AlertDialog.Builder(mContext);
                        builder.setMessage("MYTEXT")
                                .setCancelable(false)
                                .setPositiveButton("SI", new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                    Task_Started = false;
                                    startTask();
                                    }
                                })
                                .setNegativeButton("NO",
                                        new DialogInterface.OnClickListener() {
                                    public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                    }
                                });
                        AlertDialog alert = builder.create();
                        alert.show();
                    }
            }
        }

นี่คือทางออกสำหรับฉัน


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

5

อันนี้ใช้ได้สำหรับฉัน:

<application
           android:allowBackup="true"
           android:icon="@mipmap/ic_launcher"
           android:label="@string/app_name"
           android:theme="@style/AppTheme" >
           <activity
               android:name=".MainActivity"
               android:label="@string/app_name"
               android:theme="@style/Theme.AppCompat.NoActionBar">

               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />

                   <category android:name="android.intent.category.LAUNCHER" />
               </intent-filter>
           </activity>
</application>

5

กิจกรรมของคุณมีการขยายActionBarActivityที่ต้องใช้AppCompat.themeจะนำมาใช้ เปลี่ยนจากActionBarActivityเป็นActivityหรือFragmentActivityก็จะแก้ปัญหาได้

หากคุณไม่ใช้แถบการกระทำ:

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 

5

ฉันได้รับปัญหาเดียวกันนี้ เพราะฉันกำลังสร้างลิ้นชักการนำทางที่กำหนดเอง แต่ฉันลืมที่จะพูดถึงชุดรูปแบบในรายการของฉันเช่นนี้

android:theme="@style/Theme.AppCompat.NoActionBar"

ทันทีที่ฉันเพิ่มธีมด้านบนลงในรายการของฉันมันจะแก้ไขปัญหาได้


4

ทางออกที่รวดเร็ว

เปลี่ยนพาเรนต์ธีมฐานของคุณใน styles.xml

แทนที่จาก

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

ถึง

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

ไม่ช่วยฉันข้อยกเว้นยังคงเป็นต้นเหตุ
Eugene Gr Philippov

3

วิธีนี้ใช้ได้ผลสำหรับฉัน

ไลบรารีการออกแบบขึ้นอยู่กับ Support v4 และ AppCompat Support Libraries ดังนั้นอย่าใช้เวอร์ชันที่แตกต่างกันสำหรับ appcompat และไลบรารี่ออกแบบในระดับล่าง

ใช้

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.0.0'

แทน

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