我使用衆所周知的TYPE_SYSTEM_OVERLAY
方法創建始終位於其他視圖之上的全屏疊加層。檢測狀態欄可見性/ TYPE_SYSTEM_OVERLAY不會自動調整大小
在一個Moto Atrix2 API15
和每個AVD
從API 10
通過17
疊加視圖自動調整時的狀態欄中被另一個應用程序隱藏(垂直擴展)。正如我認爲的那樣,覆蓋層似乎「保持在所有其他視圖的頂端」。當狀態欄再次出現時,覆蓋層再次自動減小其大小(垂直像素減少,基本上減去狀態欄的高度)。
這是所期望的行爲,我傾向於認爲這不是異常或有缺陷的行爲,因爲它的工作在許多不同的仿真器以及至少一個設備製造商(摩托羅拉),也許更多,但我不「T訪問addtl devices.
問題:在一個Samsung GS2 (API15)
&也Kindle Fire (API10?)
測試,覆蓋不自動調整(填寫在狀態欄曾經的空間)時,狀態欄被另一個應用程序隱藏(全屏幕應用程序後面的狀態欄)。在這些設備上,第一次創建視圖後,我無法從視圖的onSizeChanged覆蓋中獲取更多事件。
下面是相關代碼:
params = new WindowManager.LayoutParams(
1, WindowManager.LayoutParams.MATCH_PARENT,
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
|WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.TRANSPARENT);
wm.addView(sizeLayout, params);
sizeLayout有onSizeChanged覆蓋。
我玩過幾乎每一個windowmanager
layoutparam
我可以找到,包括SYSTEM_ALERT,FLAG_LAYOUT_IN_SCREEN等。我不會睡覺,直到我能解決這個問題!
編輯12年11月30日:我發現這個從@deviant:https://stackoverflow.com/a/9195733/1851478這是我做的基本上是什麼,但問題仍然存在一定的不設備自動調整大小system_overlay。也許我應該提出一個錯誤。
更多信息:如果我強制重繪(或甚至只是加載覆蓋應用程序),而在視圖樹頂部有一個全屏應用程序時,我的覆蓋仍然不會在狀態欄通常佔用的空間上繪製(即使在繪製時狀態欄不在視圖中),所以看起來好像覆蓋層沒有被覆蓋在最前面的全屏幕窗口之上(並且我已經創建並測試了很多全屏應用程序使用各種方法使它們全屏顯示)。在這些設備上,只有使用標誌FLAG_LAYOUT_IN_SCREEN
才能使覆蓋圖繪製狀態欄(即使狀態欄不在視圖中),但佈局的大小始終不變,始終爲全屏,並因此回到原來的問題,爲什麼這可以在一些設備上運行,而不是其他設備。
編輯12年12月12日:所以我沒有任何這進一步運氣,我也嘗試在視圖中使用getLocalVisibleRect,但不幸的是,因爲我的應用程序沒有自己的SystemUI看待它可以檢測到疊加層下面有什麼。我想用自定義ROM我可以做到這一點,但我需要一個沒有根的解決方案。
我確實看到市場上的其他應用程序在檢測我上面列出的非工作電話上的狀態欄時遇到同樣的問題。例如:酷工具,歐米茄狀態欄&狀態欄+。賞金提出。
編輯12/19/12添加的圖片。請注意,在工作設備上,灰色區域也「覆蓋」黑色區域(任何當前爲全屏的應用程序),黑色區域實際上覆蓋整個屏幕,我只是將灰色區域顯示爲覆蓋區域,即使它也是全屏(減去或加上狀態欄的高度,取決於工作/非工作設備以及它是否在視圖中)。
請問您可以添加所需行爲的屏幕截圖以及您所得到的結果嗎? –
@Anis圖片添加。 – logray
你是否試圖轉向全屏?在添加視圖之前,請嘗試: //全屏顯示 WindowManager.LayoutParams attrs = mActivity.getWindow()。getAttributes(); attrs.flags | = WindowManager.LayoutParams.FLAG_FULLSCREEN; mActivity.getWindow()。setAttributes(attrs); –