Android幾種彈窗的實現

  1. 直接使用android sdk裏面的Dialog以及子類AlertDialog,這種彈窗要求依賴Activity環境,如果傳入的context不是activity就會報錯,所以這種彈窗是和界面強相關的

  2. 使用系統彈窗:TYPE_SYSTEM_ALERT,而且要加權限:android.permission.SYSTEM_ALERT_WINDOW

AlertDialog.Builder dialog = new AlertDialog.Builder(context);
        dialog.setInverseBackgroundForced(false);
        dialog.setCancelable(true);
        AlertDialog systemDialog = dialog.create();
        systemDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);

這種彈窗不會依賴於app的activity界面,就算app退回到主界面,這種系統彈窗依然可以彈出來,但是由於是系統彈窗所以就跟系統有關,會有兼容性問題,例如我遇到的小米4c手機就默認不允許系統彈窗,要到設置裏面去打開允許的開關才能彈出來,而且系統彈窗默認的外觀都很難看,因此可通過getWindow().setContentView(View)來自定義彈窗的佈局內容,這時候也有兼容性問題,還是小米4c,就算你允許了系統彈窗,系統彈窗談出來了,但是彈窗裏面自定義的按鈕點擊事件全部都無效。
3. 使用Activity來實現彈窗,採用這種方式我覺得是最好的方式,因爲它就是一個activity,只不過是彈窗模式,配置文件裏面可以這麼配置:

<activity android:name=".view.setting.update.WifiAlertDialog"
            android:launchMode="singleTask"
            android:theme="@style/CustomDialog" />

<style name="CustomDialog" parent="@android:style/Theme.Dialog">
        <item name="android:windowFrame">@null</item>
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:background">@drawable/land_popup</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowNoTitle">true</item>
    </style>

只需要startActivity就可以了,但是在startActivity的時候傳進去的context如果不是activity類型,而且launchMode=”singleTask”那也會報錯,不過可以通過設置flag來解決:intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

發佈了52 篇原創文章 · 獲贊 35 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章