1. 程式人生 > >彈出AlertDialog的時候報You need to use a Theme.AppCompat theme (or descendant) with this activity錯誤

彈出AlertDialog的時候報You need to use a Theme.AppCompat theme (or descendant) with this activity錯誤

今天遇到一個bug,用百度地圖的時候,我對上面的標註設定了點選監聽,設定的相應的反應是彈出一個AlertDialog

記錄一解決bug的歷程

但是Dialog卻沒有彈出來,一看AS下面,報了這錯,起初我看我gradle.app裡面

implementation 'com.android.support:appcompat-v7:24.2.1'

  

這句話是紅色,我以為是包衝突,但是上午我安卓課上我明明也是用的這個,是可以正常彈出Dialog的

然後我查了查網上,

一種說法:很多說把Activity的父類換成android.app.Activity,我一試,但是發現繼承他的話getActionBar()就沒有了

二種說法:把Style.xml的ApptTheme 的風格換成沒有ActionBar的,而這肯定不是我要的答案,因為我的有ActionBar

之後我可算是找到了答案(其實說到底是偷懶耍小聰明導致的)

連結在這http://www.voidcn.com/article/p-okazhnzl-hx.html

原因出在我的AlertDialog程式碼裡

AlertDialog dialog = new AlertDialog.Builder(Passenger.this)
                            .setTitle("乘客資訊")
                            .setView(view)
                            .create();
                    dialog.setTitle("使用者乘客");
                    dialog.setCanceledOnTouchOutside(false);
                    dialog.show();

  

這裡是我改正過來的,我原來Builder後面的括號裡是用的getApplicationContext(),天真的我以為和Activity.this是一樣的,任何地方都可以換著用

因為之前換過幾次發現也沒什麼問題,但是我沒發現安卓課上我用的就是Activity.this...

然後我百度了一下這兩個的區別:

(1)對於getApplicationContext,我們可以假定它是一個父類,它屬於整個應用程式共有,Activity.this可以假定為其的一個子類,該子類包

含了一些特定的引用。所以,一般可以用getApplicationContext的地方都可以用特定的Activity.this代替。

(2)在生命週期上,通過getApplicationContext得到的上下文物件們只要當前的應用程式還存在,那麼該物件就會一直存在,對於Activity.this

上下文來說,只要當前的activity執行了onDestory方法,這個上下文物件就會一起被系統收回。

(3)在應用場景上,如果我們通過一個上下文物件來執行某個動作,且希望一直處於活躍狀態,那麼應該用getApplicationContext來獲取上下

文,如資料庫的操作。此時,如果採用Activity.this,那麼當前Activity呼叫onDestory方法時,資料庫就會關閉,應用程式會產生錯誤。

所以最後還是因為我把這兩個混用了的原因,我猜測原因是Dialog對應全域性上下文中的theme之類的設定和Activity.this中的是不同的所以報錯

關於這兩個的區別更詳細的區別可以看這裡,這位博主總結的很好

https://www.cnblogs.com/SZ2015/p/6884039.html

 

Last but not least,

如果看到這裡發現我的這個不適用與自己問題的朋友可以看下面:

http://www.voidcn.com/article/p-beayjmst-nx.html

這網頁下面有一系列出現這問題可能的原因的文章,總有一個適合你...