2012-11-29 25 views
37

我使用衆所周知的TYPE_SYSTEM_OVERLAY方法創建始終位於其他視圖之上的全屏疊加層。檢測狀態欄可見性/ TYPE_SYSTEM_OVERLAY不會自動調整大小

在一個Moto Atrix2 API15和每個AVDAPI 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覆蓋。

我玩過幾乎每一個windowmanagerlayoutparam我可以找到,包括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添加的圖片。請注意,在工作設備上,灰色區域也「覆蓋」黑色區域(任何當前爲全屏的應用程序),黑色區域實際上覆蓋整個屏幕,我只是將灰色區域顯示爲覆蓋區域,即使它也是全屏(減去或加上狀態欄的高度,取決於工作/非工作設備以及它是否在視圖中)。

enter image description hereenter image description here

+0

請問您可以添加所需行爲的屏幕截圖以及您所得到的結果嗎? –

+0

@Anis圖片添加。 – logray

+0

你是否試圖轉向全屏?在添加視圖之前,請嘗試: //全屏顯示 WindowManager.LayoutParams attrs = mActivity.getWindow()。getAttributes(); attrs.flags | = WindowManager.LayoutParams.FLAG_FULLSCREEN; mActivity.getWindow()。setAttributes(attrs); –

回答

1

我想,這可能是隱藏在系統中設置的知名度,隱藏的,而不是轉眼就對話窗口標題欄上的同樣的問題。這會導致對話窗口不正確居中。

爲此,這裏是我如何解決它。這可能適合您的情況,但您可能需要針對狀態欄標識符的名稱進行調整。

Window window = dialog.getWindow(); 
View view = window.getDecorView(); 
int topPanelId = getResources().getIdentifier("topPanel", "id", "android"); 
LinearLayout topPanel = (LinearLayout) view.findViewById(topPanelId); 
topPanel.setVisibility(View.GONE); 
+0

我相當肯定這將需要根(也許是一個自定義的SystemUI.apk),我需要一個解決方案沒有這些。其次,我對隱藏狀態欄並不感興趣,只是檢測它是否可見。我會玩這個,但我沒有希望。 – logray

+0

我沒有任何成功設置視圖的可見性我的應用程序不擁有...感謝嘗試。 – logray

3

希望我明白你的這裏經過,但是,在我的應用程序(TEAM BatteryBar)我也有類似的問題。 (沒有root權限)

我無法在API11以下的任何東西上檢測到全屏(並且在API11上的某些(主要是三星)設備上斷斷續續)。所以我爲它做了一個自定義監聽器,在WindowManager中添加了一個不同的佈局參數,然後通過檢查窗口大小來覆蓋onLayout來檢查statusBar是否仍然存在。從那裏你可以做任何你需要的東西到你的主視圖。

我打算整理它,但它的工作,所以我沒有:P代碼已超過一年的時間,是從我第一次開始編碼的Android所以是的。思考的食物。希望能幫助到你。

here is the code in a repo at my github複製粘貼直接從我的應用程序,我如何使用它。這裏的小片段

wm.addView(sizeLayout, params);// add your view 

// then add the next one 
Screendetect mDetector; 
mDetector = new Screendetect(this); 
mDetector.setOnFullScreenListener(new OnFullScreenListener() { 
      @Override 
      public void fsChanged(boolean FS_Bool) { 
       // TODO rethink this to be better.... bit hacky... 
       if (FS_Bool) { 
        Log.d("battbardetect", "Statusbar hidden"); 
        FS_vissible(); // do what ever you need to 
       } else if (!FS_Bool) { 
        Log.d("battbardetect", "Statusbar Vissible"); 
        FS_hidden(); // do what ever you need to 
       } 
      } 
     }); 
wm.addView(mDetector, params); 
+0

我會嘗試OnFullScreenListener,但基本上你的答案只是重新措辭/做同樣的事情,我已經嘗試過,我已記錄在所有設備上不起作用。它適用於一些,但不適用於其他(看似沒有解釋)。在非工作設備上,您的方法(和我的/ deviants)似乎無法自動檢測重疊大小調整,無論是使用OnFullScreenListener,OnGlobalLayoutListener還是覆蓋重疊佈局上的onSizeChanged。 – logray

+0

我看着你的代碼,你只是重寫onLayout,我已經嘗試過在非工作設備上沒有成功。在我的示例/問題中,我重寫onSizeChanged,並試圖覆蓋幾乎所有的視圖方法,我可以在一個膨脹的疊加布局(幾乎就像你一樣)。 – logray

+1

好的謝謝你的嘗試。我嘗試了你的代碼,幾乎是單詞和相同的問題,onLayout僅在視圖第一次添加(或配置更改)時才調用一次,並且不會再次直到服務(或視圖)被銷燬/刪除並創建/添加再次。即使我反覆添加和刪除視圖,垂直尺寸也不會改變,除非我在屏幕標誌中添加布局。所以基本上同樣的問題,至少在三星GS2 API15上測試過。 BTW onSystemUiVisibilityChange也不起作用。我沒有收到任何事件:GS2設備是帶有物理導航鍵的ICS。 – logray