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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM