今天遇到一個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
這網頁下面有一系列出現這問題可能的原因的文章,總有一個適合你...