Android任何界面彈出對話框最好的解決辦法

          在工作中經常會出現這樣一種情況,接收到一條廣播消息,則在APP內任意界面彈出一個對話框。常見的做法是收到消息後創建AlertDialog對象,然後該設置Title就設置Title,設置Message就設置Message ,或者自己的View,以及確定和關閉按鈕,這裏要注意的是哪怕在廣播內打開對話框,創建AlertDialog對象的參數Context也要是Activity的,不能直接用廣播中onReceive()內的Context,否則會沒效果,大家可以試下。
          既然如此我們有兩個方法能正常的從廣播的彈出對話框了:

1.設置一個全局的Context,在每個Activity的onCreate()方法中賦值,如果嫌麻煩,也可以創建一個Activity的父類,然後所有界面都繼承這個父類,在廣播中創建AlertDialog對象時,傳入這個全局的Context是能夠實現需求的。但是這樣有個缺點。可能會報錯導致程序崩潰,報錯的內容是:

 崩潰:result = android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@6dcdc21 is not valid; is your activity running?
	at android.view.ViewRootImpl.setView(ViewRootImpl.java:679)
	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:342)
	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:94)
    at android.widget.Toast$TN.handleShow(Toast.java:459)
	at android.widget.Toast$TN$2.handleMessage(Toast.java:342)
	at android.os.Handler.dispatchMessage(Handler.java:102)
	at android.os.Looper.loop(Looper.java:154)
	at android.app.ActivityThread.main(ActivityThread.java:6121)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

所以儘量不要用第一種解決辦法,儘管這種方法更簡單直白。

2.創建Activity,佈局是個對話框,將對話框外的佈局做成透明即可,雖然看上去是個對話框,其實本質上是Activity,上面的崩潰問題也不會出現了。當然如果只是在佈局文件中將背景顏色設置成透明很顯然是不夠的,需要在AndroidManifest.xml設置Activity時設置自定義的theme纔行,比如說:
 

  <activity
            android:name=".xxx.xxxActivity"
            android:launchMode="singleTop"
            android:theme="@style/dialogActivity"
            />

然後在values目錄下面styles.xml文件中添加:
 

    <style name="dialogActivity" parent="Theme.AppCompat.DayNight.NoActionBar">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

這樣就可以了!!!

          

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章