2013-01-06 31 views
7

我一直在與setSystemUiVisibility()作鬥爭,試圖隱藏一段時間的軟導航按鈕(對於視頻播放器)。它似乎不像廣告一樣工作。這是我的代碼,在可見的FrameLayout內。setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION)不起作用

void setNavVisibility(boolean visible) 
{ 
    int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; 
    if (!visible) 
    { 
     newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    } 
    setSystemUiVisibility(newVis); 
} 

從SDK例子稍加修改:

void setNavVisibility(boolean visible) { 
     int newVis = SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
       | SYSTEM_UI_FLAG_LAYOUT_STABLE; 
     if (!visible) { 
      newVis |= SYSTEM_UI_FLAG_LOW_PROFILE | SYSTEM_UI_FLAG_FULLSCREEN 
        | SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
     } 

也不叫的時候做任何事情。當我從不同的View呼叫他們時,我獲得了一些成功,但文檔沒有提及您打電話給的View有什麼影響?我認爲這裏的文檔有些缺乏(意外的驚喜)。有誰知道發生了什麼事?

回答

21

嗯,顯然我duplicated my own question!但無論如何,我找到了答案:閱讀源代碼後 - 這往往是找東西出Android的土地的唯一途徑 - 我發現下面的無證事實:

setSystemUiVisibility( )只有當你調用它的視圖可見時才起作用!

甚至更​​多:您可以通過調用setSystemUiVisibility()必須的視圖保持可見,以便導航欄保持隱藏狀態。感謝記錄這些傢伙,真的很棒。

以下是相關的代碼,在View.java

void performCollectViewAttributes(AttachInfo attachInfo, int visibility) { 
    if ((visibility & VISIBILITY_MASK) == VISIBLE) { 
     if ((mViewFlags & KEEP_SCREEN_ON) == KEEP_SCREEN_ON) { 
      attachInfo.mKeepScreenOn = true; 
     } 
     attachInfo.mSystemUiVisibility |= mSystemUiVisibility; 
     ListenerInfo li = mListenerInfo; 
     if (li != null && li.mOnSystemUiVisibilityChangeListener != null) { 
      attachInfo.mHasSystemUiListeners = true; 
     } 
    } 
} 
+0

幹得好!不幸的是,這種情況讓位於真正煩人的錯誤。 –

+0

你能說你如何解決這個問題嗎?那麼什麼時候可以調用'''setSystemUiVisibility'''呢? –

+0

只需在佈局中總是可見的某處使用空的'View'。 – Timmmm

1

你確定沒有用戶交互嗎?即模仿觸摸,導致控件瞬間重現?

docs

SYSTEM_UI_FLAG_HIDE_NAVIGATION:這裏有一個限制:因爲導航控制是非常重要的,最少的用戶交互將導致他們立即重新出現。發生這種情況時,該標誌和SYSTEM_UI_FLAG_FULLSCREEN將自動清除,以便兩個元素同時重新出現。

在附註中,我發現在某些情況下,即使使用JB中的股票視頻播放器,視圖也沒有調整大小。我認爲它(或者)是一個錯誤。

+0

相當從看代碼肯定。有沒有更好的方法來說明? – Timmmm

4

我使用setOnSystemUiVisibilityChangeListener()使這個全屏模式對我有用,包括隱藏導航欄。

@Override 
protected void onResume() { 
    if (Build.VERSION.SDK_INT >= 16) { 
     getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(
       new OnSystemUiVisibilityChangeListener() { 
        @Override 
        public void onSystemUiVisibilityChange(int visibility) { 
         if ((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) { 
          getActionBar().show(); 
         } else { 
          int mUIFlag = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
            | View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
            | View.SYSTEM_UI_FLAG_LOW_PROFILE 
            | View.SYSTEM_UI_FLAG_FULLSCREEN 
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
          getWindow().getDecorView() 
            .setSystemUiVisibility(mUIFlag); 
          getActionBar().hide(); 
         } 
        } 
       }); 
    } 

    super.onResume(); 
} 

似乎只有Android的觸發setSystemUiVisibility()當監聽器裏。

3

我實現了這個如下不過我會在底部的空白間隙(見截圖)

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
      getWindow().getDecorView().setSystemUiVisibility(
        View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
          | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
          | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
          | View.SYSTEM_UI_FLAG_LOW_PROFILE 
          | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
          | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
          | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY 
      ); 
     } 
    } 
} 

enter image description here

+0

您應該將此作爲另一個問題發佈,而不是回答(它不是)。 – Timmmm

+0

這將是一個重複:) –