日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析

發布時間:2025/3/17 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

錯誤原因:android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@5ec06ba is not valid; is your activity running?

Spinner有個可以設置Item彈出的樣式的屬性:android:spinnerMode="dialog"?如果設置成“dropDown” (默認)?會直接閃退

“dialog”和“dropDown”?有什么不同的地方?

查看源碼尋找spinnerMode?用到的地方,發現構造方法有個int mode的參數。

參看構造方法的最終實現

public Spinner(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes, int mode,Theme popupTheme)/** *

* @param mode Constant describing how the user will select choices from * the spinner.

* @see #MODE_DIALOG

* @see #MODE_DROPDOWN

*/

mode的默認值是MODE_THEME 即樣式為MODE_DIALOG 。

總結:

通過對以上源碼的分析,發現SpinnerMode有兩種dialog和DialogPopup,當SpinnerMode為dialog時,Spinner內部選擇用一個DialogPopup來顯示下拉列表內容;當SpinnerMode為dropDown時,Spinner選擇用一個DropdownPopup來顯示下拉列表內容

再次對比DialogPopup與DropdownPopup的區別

發現,DialogPopup用的是dialog去顯示item的,DropdownPopup用的是popwindow顯示item。所以問題變成為在popwindow中嵌套使用dialog沒有問題,而popwindow嵌套使用popwindow就會報錯。關于PopupWindow、Dialog窗口添加機制的不同之處推薦閱讀Android 窗口添加機制系列2-Dialog,PopupWindow,Toast。

總結如下:

PopupWindow

PopupWindow本身依附的WindowToken實際上是也是Activity所依附的WindowToken,這也就是說PopupWindow與Activity所使用的WindowToken是一致的。

PopupWindow內部不能再使用PopupWindow是因為它獲取不到父PopupWindow的WindowToke,從這里我們也可以分析出,一個視圖內部不能嵌套與之平級的視圖。

Dialog

Dialog在初始化視圖時,在獲取到Activity的WindowToken后,會重新new一個Window,它與Activity分屬于不同的Window。

所以就不會報出WindowManager 獲取不到當前activity沒有running的問題。

解決方案有以下方式:

1.直接將SpinnerMode修改為dialog。但是這樣會變成在PopupWinow上彈出一個Dialog,影響美觀

2.將PopupWindow替換為Dialog,dialog上使用PopupWindow

3.將PopupWindow換為Activity,可能不適用于就是只想彈窗顯示

4.使用自定義組件實現類Spinner效果。比如點擊顯示一個layout,里面放置textview。

新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!

總結

以上是生活随笔為你收集整理的android弹窗闪退,[Android 小记] PopupWindow中放置Spinner 点击直接闪退的问题分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。