Anda perlu menggunakan tema Theme.AppCompat (atau keturunan) dengan aktivitas ini

1004

Android Studio 0.4.5

Dokumentasi Android untuk membuat kotak dialog khusus: http://developer.android.com/guide/topics/ui/dialogs.html

Jika Anda menginginkan dialog khusus, Anda dapat menampilkan Aktivitas sebagai dialog alih-alih menggunakan Dialog APIs. Cukup buat aktivitas dan setel temanya ke Theme.Holo.Dialog di <activity>elemen manifes:

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

Namun, ketika saya mencoba ini saya mendapatkan pengecualian berikut:

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

Saya mendukung yang berikut ini, dan saya tidak bisa menggunakan sesuatu yang lebih besar dari 10 untuk min:

minSdkVersion 10
targetSdkVersion 19

Dalam gaya saya, saya memiliki yang berikut:

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

Dan dalam manifes saya, saya memiliki ini untuk kegiatan:

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

Membuat kotak dialog seperti ini adalah sesuatu yang ingin saya lakukan, karena saya sudah menyelesaikan tata letak.

Adakah yang bisa memberitahu saya bagaimana saya bisa mengatasi masalah ini?

ant2009
sumber
2
@Raghunandan, saya baru dalam hal ini tetapi melihat gaya saya, saya memiliki yang berikut: <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> Dan saya memiliki impor berikut: import android.support.v7 .app.ActionBarActivity; impor android.support.v7.app.ActionBar; impor android.support.v4.app.Fragment; Tetapi tidak yakin apa artinya semua ini.
ant2009
10
Anda menggunakan AppCompatyang membentuk pustaka pendukung untuk mendukung bilah tindakan di bawah api level 11. Cukup gunakan android:theme="@style/AppTheme" >untuk aktivitas dalam manifes
Raghunandan
2
@ ant2009, untuk mengklarifikasi apa yang dikatakan @Raghunandan: di Anda AndroidManifest.xml, tema yang Anda tentukan untuk aktivitas Anda mengesampingkan tema yang Anda tentukan untuk aplikasi Anda. Hapus android:themegaris dari <activity>tag.
cryptochronoconolite
3
Melakukan hal ini akan menghapus kesalahan tetapi tidak membawanya ke tempat yang diinginkannya yang merupakan kegiatan dengan tema dialog. Aturan umum adalah bahwa jika Anda ingin aktivitas Anda memiliki bilah tindakan, itu harus memiliki tema AppCompat dan kode java harus memperluas ActionBarActivity. Jika Anda memiliki aktivitas yang tidak memerlukan bilah tindakan (seperti aktivitas bertema dialog), Anda dapat menerapkan tema apa pun untuknya tetapi kode java harus memperpanjang aktivitas lama yang polos.
Bobbake4
1
Saya pikir satu-satunya masalah dalam hal ini adalah konteks yang Anda berikan untuk konstruktor Dialog. Lihat jawaban saya. stackoverflow.com/a/51574281/232727
Vitaliy A

Jawaban:

1124

Alasan Anda mengalami masalah ini adalah karena aktivitas yang Anda coba terapkan pada tema dialog diperluas ActionBarActivityyang memerlukanAppCompat tema untuk diterapkan.

Pembaruan : Memperluas AppCompatActivity juga akan memiliki masalah ini

Dalam hal ini, ubah warisan Java dari ActionBarActivitymenjadi Activitydan biarkan tema dialog dalam manifes karena itu, bukan Theme.AppCompatnilai


Aturan umum adalah bahwa jika Anda ingin kode Anda mendukung versi Android yang lebih lama, itu harus memiliki AppCompattema dan kode java harus diperluas AppCompatActivity. Jika Anda memiliki * aktivitas yang tidak memerlukan dukungan ini, seperti Anda hanya peduli dengan versi dan fitur Android terbaru, Anda dapat menerapkan tema apa pun untuknya, tetapi kode java harus lebih lama dari yang biasa Activity.


CATATAN: Ketika mengubah dari AppCompatActivity(atau subkelas, ActionBarActivity), menjadi Activity, juga harus mengubah berbagai panggilan dengan "dukungan" ke panggilan yang sesuai tanpa "dukungan". Jadi, alih-alih getSupportFragmentManager, hubungi getFragmentManager.

Bobbake4
sumber
6
op menggunakan appcompat dalam hal ini ia harus memperluas ActionBarActivityapa yang ditunjukkan dari pernyataan impornya dari komentar di bawah pertanyaan.
Raghunandan
2
@Bursos Jika Anda berbicara tentang saat Anda membuat proyek baru di Android Studio, saya rasa itu adalah bug dalam konfigurasi standar.
Bobbake4
2
@ Bobbake4, Saya memiliki masalah yang sama, dan solusi ini tidak mungkin bekerja untuk saya. Masalahnya adalah saya tidak dapat memperpanjang Activity, karena saya memiliki banyak kelas (seluruh proyek) yang menyampaikan pada ActionBarActivity. Apakah ada solusi lain untuk masalah ini? Thx
5er
6
@ 5er Jika Java Anda menggunakan ActionBarActivity, tema tersebut harus diperluas Theme.AppCompat. Ada beberapa tema bawaan yang memperluas Theme.AppCompat atau Anda dapat memperluasnya sendiri dan memodifikasinya. Tanpa menghapus induk ActionBarActivity Anda tidak dapat berkeliling menggunakan Theme.AppCompat.
Bobbake4
26
Dalam style <style name = "AppTheme" parent = "Theme.AppCompat.Light.DarkActionBar"> ini menyelesaikan masalah saya. :)
Harmeet Singh
545

Yang perlu Anda lakukan adalah menambahkan android:theme="@style/Theme.AppCompat.Light"tag aplikasi Anda dalam AndroidManifest.xmlfile.

baru saja
sumber
2
Dalam kodenya, ant2009 telah menetapkan AppTheme sebagai aplikasi mereka yang berasal dari keturunan Theme.AppCompat. Itu seharusnya bekerja. Saya memiliki masalah yang sama setelah memutakhirkan ke 5.0 pada perangkat saya dan akhirnya menetapkan @ style / Theme.AppCompat.Light sebagai tema pada aktivitas saya. Sesuatu yang tidak beres di sini ...
speedynomads
36
Ini bukan jawaban yang valid untuk Android Studio, meskipun dalam beberapa kasus ini akan berfungsi sebagai perbaikan cepat ketika seseorang mem-bypass file styles.xml. Di Android Studio, cara yang tepat untuk mendefinisikan tema adalah dengan mendefinisikannya dalam file styles.xml, dan kemudian file Android hanya akan merujuknya, dan memilihnya berdasarkan versi Android yang Anda jalankan di perangkat Anda. Biasanya disetel ke android: theme = "@ style / AppTheme" dan AppTheme ini merujuk ke <style name = "Theme.AppTheme" parent = "Theme.AppCompat.Light"> di styles.xml
zeeshan
5
Ini tidak benar-benar bekerja untuk saya karena bilah judul saya menghilang ketika saya menggunakan sesuatu selain holo ...
AndyD273
1
Berlari ke masalah ini juga menggunakan SnackBar. Ini menyelesaikan masalah saya.
bekerja
2
@ Martin jika Anda seperti saya, Anda lupa untuk menambahkan nama gaya yang sama di file styles.xml umum daripada yang Anda masukkan ke dalam file styles.xml (V21) (tanpa properti khusus untuk V21). Jika Anda mendeklarasikan gaya dalam folder V21 dan perangkat Anda memiliki versi di bawah ini. Tidak dapat menemukannya sehingga pengecualian dipecat.
letroll
275

Menyalin jawaban dari @ MarkKeen di komentar di atas karena saya memiliki masalah yang sama.

Saya memiliki kesalahan yang dinyatakan di bagian atas posting dan terjadi setelah saya menambahkan dialog peringatan. Saya memiliki semua informasi gaya yang relevan di manifes. Masalah saya disembuhkan dengan mengubah referensi konteks di pembangun lansiran - Saya mengubah:

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

untuk:

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

Dan tidak ada lagi masalah.

AK
sumber
5
Itu terjadi dengan saya juga. Saya hanya mencoba dan jawaban Anda benar-benar berhasil! Apa logika agar bisa bekerja? Saya benar-benar tidak mengerti.
kirtan403
6
Atau, jika Anda sedang membangun AlertDialog Anda dalam sebuah fragmen, daripada langsung dalam suatu Kegiatan, gunakan getActivity()daripada thisseperti yang disarankan di atas dan masalahnya sudah diperbaiki. Adapun alasannya, saya hanya dapat menduga kode AlertDialog.Builder (xxx) yang lebih lama baik menginginkan jenis yang berbeda diteruskan, atau hanya sedikit pilih-pilih tentang apa yang diteruskan, sedangkan Builder saat ini () benar-benar menginginkan sebuah Aktivitas. Karena Google telah memilih untuk menyembunyikan (menghapus?) Dokumentasi untuk kode lama, mungkin dalam upaya untuk mendorong penggunaan versi v7.app, saya tahu tidak ada cara untuk memastikannya.
Anne Gunn
Apakah kebalikan dari apa yang disarankan. Dan itu berhasil: P. Terima kasih!
Harisewak
1
Ini menyelesaikan program untuk saya, juga Anda akan menggunakan getContext()alih-alih thisjika Anda berada di dalam kelas ArrayAdapter atau serupa.
Ibrahim. H
1
Ini adalah solusi asli yang pernah saya temui. TIP: Sebutkan perbedaan dalam getApplicationContext () dan ini untuk tujuan ini.
prazeev
109

min SDK adalah 10. ActionBartersedia dari api level 11. Jadi untuk 10 Anda akan menggunakan AppCompatdari perpustakaan dukungan yang Anda perlu gunakan Theme.AppCompatatau turunan dari yang sama.

Menggunakan

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

Atau jika Anda tidak ingin panel tindakan di bagian atas

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

Info lebih lanjut @

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

Edit:

Saya mungkin salah membaca pos operasi.

Tampaknya op ingin Dialog dengan Tema Aktivitas. Jadi seperti yang sudah disarankan oleh Bobbake4 memperpanjang Activitybukannya ActionBarActivity.

Juga lihat Atribut Dialog di tautan di bawah ini

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

Raghunandan
sumber
Terima kasih untuk sarannya. Sebenarnya saya sudah mencobanya. Dan saya mendapat masalah yang sama. File gaya saya terlihat seperti ini: <style name = "AppTheme" parent = "Theme.AppCompat">
ant2009
@ ant2009 Anda tidak akan. Gunakan tema dari pustaka dukungan AppCompat untuk aktivitas Anda
Raghunandan
Saya tidak yakin apakah saya menambahkan tema ini dengan benar. Tapi maksud Anda menambahkan pernyataan impor berikut? import android.support.v7.appcompat. *; Namun, saya sudah mencobanya dan mungkin saya salah karena saya masih berakhir dengan pengecualian yang sama.
ant2009
@ ant2009 Anda dapat memiliki dialog khusus. Tetapi apakah Anda ingin dialog layar penuh?
Raghunandan
Saya tidak ingin memilikinya layar penuh. Hanya kotak dialog. Namun, masalahnya selesai sekarang. Bobbake4 melakukannya dengan benar. Terima kasih atas usaha Anda, Anda telah memberikan saran yang bermanfaat. Namun, saya masih bingung dengan semua perpustakaan dukungan ini dan AppCompat.
ant2009
99

Jika Anda menggunakan konteks aplikasi, seperti ini:

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

ubah ke konteks aktivitas seperti ini:

final AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
Darush
sumber
Sama jika Anda menggunakan LayoutInflater.from (<konteks aplikasi>), pastikan Anda menggunakan konteks aktivitas atau LayoutInflater yang disediakan sehingga mewarisi Tema yang tepat.
lbarbosa
1
Solusi Anda membantu saya dalam kasus saya. Bisakah Anda menjelaskan apa perbedaan antara getApplicationContext () dan MainActivity.this?
kostyabakay
lihat tautan ini: stackoverflow.com/questions/22966601/…
Darush
9
Anda memerlukan aktivitas, bukan konteks, untuk menampilkan dialog
behelit
solusi ini menyelesaikannya
Mohamed Amin
45

Saya mengalami masalah ini meskipun Tema saya adalah AppCompatTema dan Aktivitas saya adalah AppCompatActivity(atauActivity , seperti yang disarankan pada jawaban orang lain). Jadi saya membersihkan, membangun kembali, dan menjalankan kembali proyek.

( Bangun -> Bersihkan Proyek; Bangun -> Bangun Kembali Proyek; Jalankan -> Jalankan )

Ini mungkin terlihat bodoh, tetapi sekarang berfungsi dengan baik !

Semoga ini membantu!

Geraldo Neto
sumber
1
Memiliki pesan yang sama persis setelah menambahkan DialogFragment ke aktivitas AppCompat. File, Batalkan Cache / Restart memperbaikinya dalam keadaan darurat.
halxinate
2
Saya mencoba hampir semua jawaban di utas ini. tetapi hanya jawaban yang tampaknya "bodoh" ini yang berhasil. Terima kasih!
Dika
27

Inilah yang diperbaiki untuk saya: alih-alih menentukan tema dalam manifes, saya menentukannya onCreateuntuk setiap aktivitas yang diperluas ActionBarActivity:

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

Ini MyAppThemeadalah turunan dari Theme.AppCompat, dan didefinisikan dalam xml. Perhatikan bahwa tema harus ditetapkan sebelum super.onCreatedan setContentView.

k29
sumber
1
Robolectric melempar NullPointerException pada garis setTheme ketika mencoba memuat sumber daya. Ada yang tahu kenapa?
Rhys Davis
@RhysDavis Sulit mengatakan tanpa jejak stack, tapi mungkin ia ingin setContentView terlebih dahulu? Dalam hal perbaikan ini tidak akan bekerja untuk Anda.
k29
19

pergi ke gaya Anda dan taruh orang tua

parent="Theme.AppCompat"

dari pada

parent="@android:style/Theme.Holo.Light"
Yamen Nassif
sumber
Mengapa kita dapat melakukan ini dengan kegiatan standar. Apakah Android tidak menempatkan bilah tindakan pada Kegiatan Standar dengan ICS atau Honecomb? Apakah kita harus selalu menggunakan ActionBarActivity jika kita menetapkan target minimum kita ke SDK ICS?
Andrew S
cara melihat tema mana yang harus kita gunakan dengan jenis atau fitur yang kita gunakan karena ketika kita mengimpor kita memiliki semua jenis tema yang tersedia
blackHawk
16

Dalam kasus saya, saya tidak memiliki file nilai-v21 di direktori res saya. Kemudian saya membuatnya dan menambahkan kode-kode berikut:

  <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>
Ali Gürelli
sumber
Saya menjalankan proyek saya di perangkat Oreo + dan hanya ini yang berhasil untuk saya.
Nishant Soni
16

Ubah tema Kegiatan yang diinginkan. Ini bekerja untuk saya:

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

Saya mengalami crash pada perangkat Samsung meskipun aktivitasnya memang menggunakan Theme.AppCompat . Penyebab utama terkait dengan optimasi aneh di sisi 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

Solusi saya baru saja dihapus android:launchMode="singleTask"

GoRGon
sumber
2
Hanya berlari ke ini juga, saya belum memvalidasi perbaikan dan tidak dapat mereproduksi kesalahan .. tapi saya melihat kesalahan ini secara liar di perangkat samsung saja. sebagian besar tampaknya berakar juga,
fwiw
Saya memiliki kesalahan yang dinyatakan di atas pos dan terjadi setelah saya menambahkan dialog peringatan. Saya memiliki semua informasi gaya yang relevan di manifes. Masalah saya disembuhkan dengan mengubah referensi konteks di pembangun lansiran - Saya mengubah: android.support.v7.app.AlertDialog.Builder baru (getApplicationContext ()) ke: new android.support.v7.app.AlertDialog.Builder (ini ) dan tidak ada lagi masalah ...
Mark Keen
Apakah Anda memiliki detail atau tautan ke samsung tentang pengoptimalan ini? Apakah semua kegiatan harus menerapkan Theme.AppCompat atau ada kegiatan tanpa tema?
AAverin
13

Jika Anda perlu memperpanjang ActionBarActivity yang Anda butuhkan di style.xml Anda:

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

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

Jika Anda menetapkan sebagai tema utama aplikasi Anda sebagai android: Theme.Material.Light alih-alih AppTheme.Base maka Anda akan mendapatkan "IllegalStateException: Anda perlu menggunakan tema Theme.AppCompat (atau keturunan) dengan aktivitas ini" kesalahan.

Jonas Oliveira
sumber
13

Kerjakan saja

new AlertDialog.Builder(this)

Dari pada

new AlertDialog.Builder(getApplicationContext())
Ali Akram
sumber
Solusi bekerja! 30 menit untuk mencari tahu dengan jawaban ini. Mengapa saya menggunakan AlertDialog.Builder baru (getApplicationContext ())?
Erich García
Akan sangat membantu untuk menjelaskan tipe apa yang thisdiharapkan.
Blago
12

Saya memiliki masalah yang sama, tetapi diselesaikan ketika saya menempatkan ini pada manifes: 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>
Marc Baduq
sumber
10

Dalam kasus saya, masalah seperti itu muncul ketika saya mencoba menampilkan Dialog. Masalahnya adalah dalam konteks, saya telah menggunakan getBaseContext () yang secara teoritis harus mengembalikan konteks Aktivitas, tetapi tampaknya tidak, atau mengembalikan konteks sebelum Tema diterapkan.

Jadi saya baru saja mengganti getBaseContexts () dengan " ini ", dan sekarang berfungsi seperti yang diharapkan.

        Dialog.showAlert(this, title, message,....);
Vitaliy A
sumber
saya melewati getApplicaitonContext (), tetapi milik Anda berhasil
Jeeva
9

Saya memiliki aktivitas dengan tema yang <android:theme="@android:style/Theme.Dialog">digunakan untuk menampilkan dialog di appWidget saya dan saya memiliki masalah yang sama

saya memecahkan kesalahan ini dengan mengubah kode aktivitas seperti di bawah ini:

@Override
protected void onCreate(Bundle savedInstanceState) {
    setTheme(R.style.Theme_AppCompat_Dialog); //this line i added
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_dialog);
}
Elyas Nategh
sumber
2
Ini adalah jawaban langsung yang bekerja untuk saya tanpa semua kerumitan dan non-jawaban dari yang diterima.
Cory Trese
8

bagi saya solusi untuk menggunakan ContextThemeWrapper:

private FloatingActionButton getFAB() {
Context context = new android.support.v7.view.ContextThemeWrapper(getContext(), R.style.AppTheme);
FloatingActionButton fab = new FloatingActionButton(context);
return fab;}

dari Android - Bagaimana cara membuat FAB secara terprogram?

Peter
sumber
8

Pastikan Anda menggunakan konteks aktivitas saat membuat Dialog Peringatan baru dan bukan konteks aplikasi atau basis.

Shivam Dawar
sumber
7

Saya punya masalah ini juga dan apa yang saya lakukan untuk memperbaikinya, DAN masih menggunakan tema Holo adalah untuk mengambil langkah-langkah ini:

pertama saya mengganti impor ini:

import android.support.v7.app.AppCompatActivity;

dengan yang ini:

import android.app.Activity;

lalu ubah ekstensi saya dari:

public class MyClass extends AppCompatActivity {//...

untuk ini:

public class MyClass extends Activity {//...

Dan juga harus mengubah impor ini:

import android.support.v7.app.AlertDialog;

untuk impor ini:

import android.app.AlertDialog;

dan kemudian Anda dapat menggunakan tag tema Anda dalam manifes di tingkat aktivitas:

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

dan terakhir, (kecuali jika Anda memiliki kelas lain di proyek Anda yang harus menggunakan v7 appCompat) Anda dapat membersihkan dan membangun kembali proyek Anda atau menghapus entri ini dalam file build gradle di tingkat aplikasi:

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

jika Anda memiliki kelas lain di proyek Anda yang harus menggunakan v7 appCompat maka bersihkan dan bangun kembali proyek.

Wraithious
sumber
6

Anda telah melakukannya karena Anda ingin menerapkan Desain Bahan dalam gaya tema Anda di versi SDK sebelumnya ke 21. ActionBarActivitymengharuskan AppThemejadi jika Anda juga ingin mencegah kustomisasi Anda sendiri tentang AppTheme Anda, hanya Anda yang harus mengubah dalam styles.xml Anda (sebelumnya ke sdk 21) jadi dengan cara ini, dapat mewarisi tema App Compat.

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

untuk ini:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
danigonlinea
sumber
6
Lakukan itu. Masih ada masalah. Jadi ada lebih dari itu.
Martin
6

Ubah induk gaya tema Anda menjadi

 parent="Theme.AppCompat"

Ini bekerja untuk saya ...

Fazal
sumber
6

Anda memiliki banyak solusi untuk kesalahan itu.

  1. Anda harus menggunakan Activity atau FragmentActivity alih-alih ActionbarActivity atau AppCompatActivity

  2. Jika Anda ingin menggunakan ActionbarActivity atau AppCompatActivity , Anda harus mengubah styles.xml Theme.Holo.xxxx ke Theme.AppCompat.Light (jika perlu tambahkan ke DarkActionbar )

Jika Anda tidak memerlukan atribut lanjutan tentang bilah tindakan atau AppCompat Anda tidak perlu menggunakan Actionbar atau AppCompat .

Kaloglu
sumber
6

Dalam manifes Android cukup ubah tema aktivitas menjadi AppTheme sebagai ikuti cuplikan kode

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

Ini adalah saat Anda menginginkan AlertDialog dalam sebuah Fragmen

            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();
Avinash_ks
sumber
6

Dalam pengalaman saya, masalahnya adalah konteks di mana saya menunjukkan dialog saya. Di dalam tombol klik saya instantiate AlertDialog dengan cara ini:

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

Tetapi konteksnya tidak benar dan menyebabkan kesalahan. Saya telah mengubahnya menggunakan konteks aplikasi dengan cara ini:

Di bagian menyatakan:

Context mContext;

dalam metode onCreate

mContext = this;

Dan akhirnya dalam kode di mana saya membutuhkan 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();
                    }
            }
        }

Ini solusi untuk saya.

Dante
sumber
Anda benar bahwa Anda tidak boleh menggunakan konteks Aplikasi seperti yang Anda miliki sebelumnya. Apa yang telah Anda lakukan adalah menggunakan Kegiatan sebagai konteks. Namun ini bukan konteks aplikasi atau subkelasnya. Jadi tidak benar untuk mengatakan Anda menggunakan konteks Aplikasi dengan cara yang berbeda.
Hod
5

Yang ini bekerja untuk saya:

<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>
pengguna1501382
sumber
5

Aktivitas Anda memperluas ActionBarActivity yang mengharuskan penerapan AppCompat.theme . Ubah dari ActionBarActivity ke Activity atau FragmentActivity , itu akan menyelesaikan masalah.

Jika Anda tidak menggunakan bilah Tindakan, maka:

android:theme="@android:style/Theme.Light.NoTitleBar.Fullscreen" 
Md Imran Choudhury
sumber
5

Saya mendapatkan masalah yang sama. Karena saya sedang membuat laci navigasi khusus. Tapi saya lupa menyebutkan tema dalam manifes saya seperti ini

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

Segera saya menambahkan tema di atas ke manifes saya untuk menyelesaikan masalah.

Azhar osws
sumber
4

Solusi cepat.

Ubah induk tema dasar Anda di styles.xml

Ganti dari

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

untuk

<style name="AppTheme" parent="Theme.AppCompat">
Kaloglu
sumber
tidak membantu saya, pengecualian masih memicu
Eugene Gr. Philippov
3

Solusi ini berhasil untuk saya.

Pustaka desain tergantung pada Dukungan v4 dan Pustaka Dukungan AppCompat, jadi jangan gunakan versi yang berbeda untuk appcompat dan pustaka desain secara bertahap.

menggunakan

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

dari pada

 compile 'com.android.support:appcompat-v7:23.0.0'
 compile 'com.android.support:design:23.1.0'
kiran boghra
sumber