Bạn cần sử dụng một chủ đề Theme.AppCompat (hoặc hậu duệ) với hoạt động này


1004

Studio Android 0.4.5

Tài liệu Android để tạo hộp thoại tùy chỉnh: http://developer.android.com/guide/topics/ui/dialogs.html

Nếu bạn muốn có hộp thoại tùy chỉnh, thay vào đó, bạn có thể hiển thị Hoạt động dưới dạng hộp thoại thay vì sử dụng API Hộp thoại. Chỉ cần tạo một hoạt động và đặt chủ đề của nó thành Theme.Holo.Dialog trong <activity>phần tử tệp kê khai:

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

Tuy nhiên, khi tôi thử điều này, tôi nhận được ngoại lệ sau:

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

Tôi đang hỗ trợ những điều sau đây và tôi không thể sử dụng thứ gì đó lớn hơn 10 cho phút:

minSdkVersion 10
targetSdkVersion 19

Trong phong cách của tôi, tôi có như sau:

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

Và trong bản kê khai của tôi, tôi có cái này cho hoạt động:

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

Tạo hộp thoại như thế này là điều tôi đã hy vọng thực hiện, vì tôi đã hoàn thành bố cục.

Bất cứ ai có thể cho tôi biết làm thế nào tôi có thể khắc phục vấn đề này?


2
@Raghunandan, tôi chưa quen với điều này nhưng nhìn vào phong cách của tôi, tôi có những điều sau đây: <style name = "AppTheme" Parent = "Theme.AppCompat.Light.DarkActionBar"> Và tôi có các lần nhập sau: nhập android.support.v7 .app.ActionBarActivity; nhập android.support.v7.app.ActionBar; nhập android.support.v4.app.Fragment; Nhưng không chắc chắn tất cả những điều này có nghĩa là gì.
ant2009

10
Bạn đang sử dụng AppCompatmẫu thư viện hỗ trợ để hỗ trợ các thanh tác động dưới mức api 11. Chỉ cần sử dụng android:theme="@style/AppTheme" >cho hoạt động trong bảng kê khai
Raghunandan

2
@ ant2009, để biết những gì @Raghunandan đã nói: trong phần của bạn AndroidManifest.xml, chủ đề bạn đang chỉ định cho hoạt động của mình sẽ ghi đè lên chủ đề bạn đang chỉ định cho ứng dụng của mình. Xóa android:themedòng khỏi <activity>thẻ.
cryptochronoconolite

3
Làm điều này sẽ loại bỏ lỗi nhưng không đưa anh ta đến nơi anh ta muốn, đó là một hoạt động với chủ đề hộp thoại. Nguyên tắc chung là nếu bạn muốn hoạt động của mình có một thanh hành động thì nó phải có chủ đề AppCompat và mã java sẽ mở rộng ActionBarActivity. Nếu bạn có một hoạt động không cần một thanh hành động (như hoạt động theo chủ đề hộp thoại), bạn có thể áp dụng bất kỳ chủ đề nào cho nó nhưng mã java phải mở rộng hoạt động cũ đơn giản.
Bobbake4

1
Tôi nghĩ vấn đề duy nhất trong trường hợp này là bối cảnh bạn cung cấp cho công cụ Dialog. Xem câu trả lời của tôi. stackoverflow.com/a/51574281/232727
Vitaliy A

Câu trả lời:


1124

Lý do bạn gặp phải vấn đề này là vì hoạt động bạn đang cố gắng áp dụng chủ đề hộp thoại đang mở rộng ActionBarActivity, đòi hỏi AppCompatchủ đề phải được áp dụng.

Cập nhật : Mở rộng AppCompatActivitycũng sẽ có vấn đề này

Trong trường hợp này, thay đổi sự kế thừa Java từ ActionBarActivitysang Activityvà để lại chủ đề hộp thoại trong tệp kê khai như nó là, một Theme.AppCompatgiá trị không


Nguyên tắc chung là nếu bạn muốn mã của mình hỗ trợ các phiên bản Android cũ hơn, nó phải có AppCompatchủ đề và mã java sẽ mở rộng AppCompatActivity. Nếu bạn có * một hoạt động không cần hỗ trợ này, chẳng hạn như bạn chỉ quan tâm đến các phiên bản và tính năng mới nhất của Android, bạn có thể áp dụng bất kỳ chủ đề nào cho nó nhưng mã java phải mở rộng cũ Activity.


LƯU Ý: Khi thay đổi từ AppCompatActivity(hoặc một lớp con, ActionBarActivity), thành Activity, cũng phải thay đổi các cuộc gọi khác nhau bằng "hỗ trợ" thành cuộc gọi tương ứng mà không có "hỗ trợ". Vì vậy, thay vì getSupportFragmentManager, gọi getFragmentManager.


6
op đang sử dụng appcompat trong trường hợp anh ta nên mở rộng ActionBarActivity, đó là những gì được hiển thị từ các báo cáo nhập khẩu của anh ta từ bình luận bên dưới quesiton.
Raghunandan

2
@Bursos Nếu bạn đang nói về khi bạn tạo một dự án mới trong Android Studio, tôi đoán đó là một lỗi trong cấu hình tiêu chuẩn.
Bobbake4

2
@ Bobbake4, tôi có cùng một vấn đề, và giải pháp này là không thể làm việc cho tôi. Vấn đề là tôi không thể mở rộng Hoạt động, vì tôi có một nhóm các lớp (toàn bộ dự án) chuyển tiếp trên ActionBarActivity. Có giải pháp nào khác cho vấn đề này không? Thx
5er

6
@ 5er Nếu Java của bạn đang sử dụng ActionBarActivity, chủ đề phải mở rộng Theme.AppCompat. Có một số chủ đề được xây dựng mở rộng Theme.AppCompat hoặc bạn có thể tự mở rộng và sửa đổi nó. Nếu không xóa cha mẹ ActionBarActivity, bạn không thể sử dụng Theme.AppCompat.
Bobbake4

26
Trong phong cách <style name = "AppTheme" Parent = "Theme.AppCompat.Light.DarkActionBar"> điều này đã giải quyết vấn đề của tôi. :)
Harmeet Singh

545

Tất cả bạn cần làm là thêm android:theme="@style/Theme.AppCompat.Light"vào thẻ ứng dụng của bạn trong AndroidManifest.xmltệp.


2
Trong mã, ant2009 có AppTheme được đặt làm ứng dụng mà chúng mở rộng từ hậu duệ của Theme.AppCompat. Cần làm việc. Tôi gặp vấn đề tương tự sau khi nâng cấp lên 5.0 trên thiết bị của mình và kết thúc cài đặt @ style / Theme.AppCompat.Light làm chủ đề cho hoạt động của tôi. Một cái gì đó không đúng ở đây ...
speedynomads

36
Đây không phải là một câu trả lời hợp lệ cho Android Studio, mặc dù trong một số trường hợp, nó sẽ hoạt động như một cách khắc phục nhanh khi một người đang bỏ qua các tệp Styles.xml. Trong Android Studio, cách thích hợp để xác định chủ đề là xác định chúng trong các tệp kiểu tệp XML và sau đó tệp đơn giản nhất của Android sẽ chỉ tham chiếu đến chúng và chọn chúng dựa trên phiên bản Android nào bạn đang chạy trên thiết bị của mình. Thông thường, nó được đặt thành android: theme = "@ style / AppTheme" và AppTheme này đề cập đến <style name = "Theme.AppTheme" Parent = "Theme.AppCompat.Light"> trong
style.xml

5
Điều này không thực sự hiệu quả với tôi vì thanh tiêu đề của tôi biến mất khi tôi sử dụng bất cứ thứ gì ngoại trừ ...
AndyD273

1
Chạy vào vấn đề này cũng như sử dụng SnackBar. Điều này đã giải quyết vấn đề của tôi.
làm việc

2
@Martin nếu bạn giống như tôi, bạn đã quên thêm tên kiểu giống nhau trong tệp tệp kiểu tệp chung so với tệp tệp kiểu tệp (V21) (không có thuộc tính dành riêng cho V21). Nếu bạn khai báo một kiểu trong thư mục V21 và thiết bị của bạn có phiên bản bên dưới. Nó không thể tìm thấy nó vì vậy một ngoại lệ được sa thải.
hãy đăng ký

275

Sao chép câu trả lời từ @MarkKeen trong các bình luận ở trên vì tôi gặp vấn đề tương tự.

Tôi đã có lỗi được nêu ở đầu bài và đã xảy ra sau khi tôi thêm một hộp thoại cảnh báo. Tôi có tất cả các thông tin phong cách có liên quan trong bảng kê khai. Vấn đề của tôi đã được khắc phục bằng cách thay đổi tham chiếu ngữ cảnh trong trình tạo cảnh báo - Tôi đã thay đổi:

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

đến:

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

Và không còn vấn đề nữa.


5
Nó cũng xảy ra với tôi. Tôi chỉ đang cố gắng và câu trả lời của bạn thực sự hiệu quả! Logic cho nó để làm việc là gì? Tôi thực sự không hiểu.
kirtan403

6
Hoặc, nếu bạn đang xây dựng AlertDialog của mình thành một đoạn, thay vì trực tiếp trong Hoạt động, hãy sử dụng getActivity()thay vì thisnhư được đề xuất ở trên và sự cố đã được khắc phục. Về lý do tại sao, tôi chỉ có thể phỏng đoán mã AlertDialog.Builder (xxx) cũ hơn hoặc muốn một loại khác được truyền vào, hoặc đơn giản là ít kén chọn hơn về những gì đã được truyền vào, trong khi Builder () hiện tại thực sự muốn có Activity. Vì Google đã chọn ẩn (xóa?) Tài liệu cho mã cũ, có lẽ trong nỗ lực khuyến khích sử dụng phiên bản v7.app, tôi không biết cách nào để biết chắc chắn.
Anne Gunn

Đã làm ngược lại với những gì được đề xuất. Và nó đã hoạt động: P. Cảm ơn!
Harisewak

1
Điều này giải quyết chương trình cho tôi, bạn cũng sẽ sử dụng getContext()thay vì thisnếu bạn ở trong một lớp ArrayAd CHƯƠNG hoặc lớp bộ điều hợp tương tự.
Ibrahim.H

1
Đây là giải pháp chính hãng tôi từng gặp. MIPO: Vui lòng đề cập đến sự khác biệt trong getApplicationContext () và điều này trong mục đích này.
Prazeev

109

min sdk là 10. ActionBarcó sẵn từ cấp độ api 11. Vì vậy, trong 10 bạn sẽ sử dụng AppCompattừ thư viện hỗ trợ mà bạn cần sử dụng Theme.AppCompathoặc hậu duệ giống nhau.

Sử dụng

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

Hoặc nếu bạn không muốn thanh hành động ở trên cùng

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

Thêm thông tin @

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

Biên tập:

Tôi có thể đã đọc sai bài op.

Có vẻ như op muốn có một Hộp thoại với Chủ đề Hoạt động. Vì vậy, như đã được đề xuất bởi Bobbake4 mở rộng Activitythay vì ActionBarActivity.

Cũng có một cái nhìn @ Thuộc tính hộp thoại trong liên kết dưới đây

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


Cám ơn vì sự gợi ý. Tôi đã thử điều đó thực sự. Và tôi đã có cùng một vấn đề. Tệp kiểu của tôi trông như thế này: <style name = "AppTheme" Parent = "Theme.AppCompat">
ant2009

@ ant2009 bạn sẽ không. Sử dụng một chủ đề từ thư viện hỗ trợ AppCompat cho hoạt động của bạn
Raghunandan

Tôi không chắc chắn nếu tôi thêm chủ đề này chính xác. Nhưng bạn có nghĩa là thêm các báo cáo nhập khẩu sau đây? nhập android.support.v7.appcompat. *; Tuy nhiên, tôi đã thử điều đó và có lẽ tôi đã sai vì tôi vẫn kết thúc với cùng một ngoại lệ.
ant2009

@ ant2009 bạn có thể có một hộp thoại tùy chỉnh. Nhưng bạn có muốn hộp thoại toàn màn hình?
Raghunandan

Tôi không muốn có nó toàn màn hình. Chỉ là một hộp thoại. Tuy nhiên, vấn đề được giải quyết ngay bây giờ. Bobbake4 đã làm đúng. Cảm ơn bạn đã nỗ lực dù sao, bạn đã đưa ra lời khuyên hữu ích. Tuy nhiên, tôi vẫn bối rối với tất cả thư viện hỗ trợ và AppCompat này.
ant2009

99

Nếu bạn đang sử dụng bối cảnh ứng dụng, như thế này:

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

thay đổi nó thành một bối cảnh hoạt động như thế này:

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

Tương tự nếu bạn đang sử dụng LayoutInflater.from (<bối cảnh ứng dụng>), hãy đảm bảo bạn sử dụng bối cảnh hoạt động hoặc LayoutInflater được cung cấp để nó kế thừa đúng Theme.
lbarbosa

1
Giải pháp của bạn đã giúp tôi trong trường hợp của tôi. Bạn có thể giải thích sự khác biệt giữa getApplicationContext () và MainActivity.this không?
kostyabakay

tham khảo liên kết này: stackoverflow.com/questions/22966601/ từ
Darush

9
bạn cần một hoạt động, không phải ngữ cảnh, để hiển thị các hộp thoại
xử vào

giải pháp này giải quyết nó
Mohamed Amin

45

Tôi đã gặp vấn đề này mặc dù Chủ đề của tôi là AppCompatChủ đề và Hoạt động của tôi là AppCompatActivity(hoặc Activity, như được đề xuất cho câu trả lời của người khác). Vì vậy, tôi đã làm sạch, xây dựng lại và chạy lại dự án.

( Xây dựng -> Dự án sạch; Xây dựng -> Xây dựng lại dự án; Chạy -> Chạy )

Nó có vẻ ngu ngốc, nhưng bây giờ nó hoạt động tuyệt vời !

Chỉ mong nó giúp!


1
Có chính xác thông báo tương tự sau khi thêm DialogFragment vào hoạt động AppCompat. Tập tin, bộ nhớ cache không hợp lệ / Khởi động lại cố định trong một nhúm.
chia đôi

2
Tôi đã thử gần như tất cả các câu trả lời trong chủ đề này. nhưng chỉ có câu trả lời có vẻ "ngu ngốc" này hoạt động. cảm ơn bạn!
Dika

27

Đây là điều đã cố định nó cho tôi: thay vì chỉ định chủ đề trong tệp kê khai, tôi đã xác định chủ đề đó onCreatecho từng hoạt động mở rộng ActionBarActivity:

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

Đây MyAppThemelà hậu duệ của Theme.AppCompat, và được định nghĩa bằng xml. Lưu ý rằng chủ đề phải được đặt trước super.onCreatesetContentView.


1
Robolectric đang ném một NullPulumException vào dòng setTheme khi cố gắng tải tài nguyên. Bất cứ ý tưởng tại sao?
Rhys Davis

@RhysDavis Khó nói nếu không có dấu vết ngăn xếp, nhưng có lẽ nó muốn setContentView trước? Trong trường hợp đó, sửa chữa này sẽ không làm việc cho bạn.
k29

19

đi đến phong cách của bạn và đặt cha mẹ

parent="Theme.AppCompat"

thay vì

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

Tại sao chúng ta có thể làm điều này với một hoạt động tiêu chuẩn. Android đã không đặt các thanh hành động vào Hoạt động tiêu chuẩn với ICS hoặc Honecomb? Chúng ta có luôn phải sử dụng ActionBarActivity nếu chúng ta đặt mục tiêu tối thiểu của mình thành SDK ICS không?
Andrew S

Làm thế nào để xem chủ đề nào chúng ta nên sử dụng với loại hoặc tính năng chúng tôi đang sử dụng bởi vì khi chúng tôi nhập, chúng tôi có tất cả các loại chủ đề có sẵn
blackHawk

16

Trong trường hợp của tôi, tôi không có tệp giá trị-v21 trong thư mục res của tôi. Sau đó, tôi đã tạo ra nó và thêm vào nó các mã sau:

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

Tôi đã chạy dự án của mình trên các thiết bị Oreo + và chỉ điều này làm việc cho tôi.
Nishant Soni

16

Thay đổi chủ đề của Hoạt động mong muốn. Điều này làm việc cho tôi:

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

14

Tôi đã gặp sự cố như vậy trên các thiết bị Samsung mặc dù hoạt động này đã sử dụng Theme.AppCompat . Nguyên nhân sâu xa liên quan đến việc tối ưu hóa kỳ lạ về phía 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

Giải pháp của tôi chỉ là loại bỏ android:launchMode="singleTask"


2
Cũng vừa mới chạy vào đây, tôi chưa xác nhận sửa lỗi và không thể tái tạo lỗi .. nhưng tôi chỉ thấy lỗi này trong các thiết bị samsung. dường như cũng bắt nguồn từ fwiw
danb

Tôi đã có lỗi được nêu ở đầu bài và đã xảy ra sau khi tôi thêm một hộp thoại cảnh báo. Tôi có tất cả các thông tin phong cách có liên quan trong bảng kê khai. Vấn đề của tôi đã được khắc phục bằng cách thay đổi tham chiếu ngữ cảnh trong trình xây dựng cảnh báo - Tôi đã thay đổi: android mới.support.v7.app.AlertDialog.Builder (getApplicationContext ()) thành: android mới. Support.v7.app.AlertDialog.Builder (này ) và không có vấn đề gì nữa ...
Mark Keen

Bạn có bất kỳ chi tiết hoặc liên kết đến samsung về tối ưu hóa này? Có phải tất cả các hoạt động sau đó phải triển khai Theme.AppCompat hoặc có thể có các hoạt động không có chủ đề không?
AAverin

13

Nếu bạn cần mở rộng ActionBarActivity, bạn cần trên style.xml của mình:

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

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

Nếu bạn đặt làm chủ đề chính cho ứng dụng của mình là android: Theme.M vật liệu. Thay vì AppTheme.Base thì bạn sẽ gặp một lỗi IllegalStateException: Bạn cần sử dụng chủ đề Theme.AppCompat (hoặc hậu duệ) với lỗi hoạt động này.


13

Cứ làm đi

new AlertDialog.Builder(this)

Thay vì

new AlertDialog.Builder(getApplicationContext())

Giải pháp làm việc! 30 phút để tìm hiểu với câu trả lời này. Tại sao tôi lại sử dụng AlertDialog.Builder (getApplicationContext ()) mới?
Erich García

Nó sẽ hữu ích để giải thích loại thisdự kiến ​​sẽ được.
Blago

12

Tôi đã có cùng một vấn đề, nhưng nó đã được giải quyết khi tôi đưa nó lên tệp kê khai: 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

Trong trường hợp của tôi, vấn đề như vậy đã xuất hiện khi tôi cố gắng hiển thị Hộp thoại. Vấn đề là trong bối cảnh, tôi đã sử dụng getBaseContext () về mặt lý thuyết sẽ trả về bối cảnh Hoạt động, nhưng có vẻ như không hoặc nó trả về bối cảnh trước khi bất kỳ Chủ đề nào được áp dụng.

Vì vậy, tôi chỉ thay thế getBaseContexts () bằng " this " và bây giờ nó hoạt động như mong đợi.

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

tôi đã vượt qua getApplicaitonContext (), nhưng bạn đã làm được điều đó
Jeeva

9

Tôi đã có một hoạt động với chủ đề <android:theme="@android:style/Theme.Dialog">được sử dụng để hiển thị hộp thoại trong appWidget của tôi và tôi gặp vấn đề tương tự

tôi đã giải quyết lỗi này bằng cách thay đổi mã hoạt động như dưới đây:

@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
Đây là một câu trả lời đơn giản làm việc cho tôi mà không có tất cả sự phức tạp và không trả lời của câu trả lời được chấp nhận.
Cory Trese 17/12/18


8

Đảm bảo bạn đang sử dụng bối cảnh hoạt động trong khi tạo Hộp thoại cảnh báo mới chứ không phải bối cảnh ứng dụng hoặc bối cảnh cơ sở.


7

Tôi cũng gặp vấn đề này và những gì tôi đã làm để khắc phục nó, VÀ vẫn sử dụng chủ đề Holo là thực hiện các bước sau:

Đầu tiên tôi thay thế nhập khẩu này:

import android.support.v7.app.AppCompatActivity;

với cái này

import android.app.Activity;

sau đó thay đổi tiện ích mở rộng của tôi từ:

public class MyClass extends AppCompatActivity {//...

đến đây:

public class MyClass extends Activity {//...

Và cũng đã phải thay đổi nhập khẩu này:

import android.support.v7.app.AlertDialog;

để nhập khẩu này:

import android.app.AlertDialog;

và sau đó bạn có thể sử dụng thẻ chủ đề của mình trong bảng kê khai ở cấp độ hoạt động:

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

và cuối cùng, (trừ khi bạn có các lớp khác trong dự án phải sử dụng v7 appCompat), bạn có thể dọn dẹp và xây dựng lại dự án của mình hoặc xóa mục này trong tệp xây dựng lớp ở cấp ứng dụng:

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

nếu bạn có các lớp khác trong dự án của bạn phải sử dụng v7 appCompat thì chỉ cần dọn dẹp và xây dựng lại dự án.


6

Bạn đã gặp phải điều này bởi vì bạn muốn áp dụng Thiết kế Vật liệu theo kiểu chủ đề của mình trong các phiên bản sdk trước đó thành 21. ActionBarActivityyêu cầu AppThemevì vậy nếu bạn cũng muốn ngăn tùy chỉnh của riêng mình về AppTheme, chỉ có bạn phải thay đổi trong tệp XML của bạn (trước đó đến sdk 21) vì vậy theo cách này, có thể kế thừa cho một chủ đề Ứng dụng tương thích.

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

cho điều này:

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

6
Đã làm điều đó. Vẫn có vấn đề. Vì vậy, có nhiều hơn cho nó.
Martin

6

Thay đổi kiểu chủ đề của bạn thành

 parent="Theme.AppCompat"

Điều này làm việc cho tôi ...


6

Bạn có nhiều giải pháp cho lỗi đó.

  1. Bạn nên sử dụng Hoạt động hoặc FragmentActivity thay vì ActionbarActivity hoặc AppCompatActivity

  2. Nếu bạn muốn sử dụng ActionbarActivity hoặc AppCompatActivity , bạn nên thay đổi trong styles.xml Theme.Holo.xxxx để Theme.Appcompat.Light (add nếu cần thiết để DarkActionbar )

Nếu bạn không cần thuộc tính tiên tiến về thanh hành động hoặc AppCompat bạn không cần phải sử dụng Actionbar hoặc AppCompat .


6

Trong bảng kê khai của Android, chỉ cần thay đổi chủ đề hoạt động thành AppTheme như đoạn mã sau

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

<Activity android: name = ". MainActivity" android: nhãn = "@ string / app_name" android: theme = "@ style / AppTheme"> </ Activity>
shikha

6

Đây là khi bạn muốn có AlertDialog trong một mảnh

            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

Theo kinh nghiệm của tôi, vấn đề là bối cảnh tôi đã cho thấy hộp thoại của mình. Trong một nút bấm, tôi khởi tạo AlertDialog theo cách này:

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

Nhưng bối cảnh không đúng và gây ra lỗi. Tôi đã thay đổi nó bằng cách sử dụng bối cảnh ứng dụng theo cách này:

Trong phần khai báo:

Context mContext;

trong phương thức onCreate

mContext = this;

Và cuối cùng trong mã nơi tôi cần 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();
                    }
            }
        }

Đây là giải pháp cho tôi.


Bạn đúng rằng bạn không nên sử dụng bối cảnh Ứng dụng theo cách ban đầu bạn có. Thay vào đó, những gì bạn đã làm là sử dụng một Activity làm bối cảnh. Tuy nhiên, đây không phải là bối cảnh Ứng dụng hoặc một lớp con của nó. Vì vậy, không đúng khi nói bạn đang sử dụng bối cảnh Ứng dụng theo một cách khác.
Hod

5

Cái này làm việc cho tôi:

<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

Hoạt động của bạn được mở rộng ActionBarActivity mà đòi hỏi sự AppCompat.theme được áp dụng. Thay đổi từ ActionBarActivity sang Activity hoặc FragmentActivity , nó sẽ giải quyết vấn đề.

Nếu bạn không sử dụng thanh Action thì:

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

5

Tôi đã nhận được vấn đề tương tự. Bởi vì tôi đã tạo ngăn kéo điều hướng tùy chỉnh. Nhưng tôi quên đề cập đến chủ đề trong bảng kê khai của tôi như thế này

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

Ngay sau khi tôi thêm chủ đề trên vào bảng kê khai của mình, nó đã giải quyết được vấn đề.


4

Giải pháp nhanh chóng.

Thay đổi cha mẹ chủ đề cơ sở của bạn trong tệp kiểu tệp

Thay thế từ

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

đến

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

không giúp tôi, ngoại lệ vẫn kích hoạt
Eugene Gr. Philippov

3

Giải pháp này đã làm việc cho tôi.

Thư viện thiết kế phụ thuộc vào Thư viện hỗ trợ v4 và AppCompat, vì vậy đừng sử dụng phiên bản khác nhau cho appcompat và thư viện thiết kế trong lớp.

sử dụng

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

thay vì

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.1.0'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.