2015-09-24 113 views
3

我有一個使用片段保持沉浸模式時DialogFragment所示

做我躲在我的屏幕的頂部和底部的酒吧,使用下面的代碼的Android應用程序。

@Override 
protected void onResume() { 
    super.onResume(); 
    isInBackground = false; 

    if(null == getFragmentManager().findFragmentById(R.id.content_container)) 
    { 
     getFragmentManager().beginTransaction().add(R.id.content_container,new PresenterFragment(), PresenterFragment.FRAG_TAG).commit(); 
    } 

    if(Build.VERSION.SDK_INT >=19) 
    { 
     View decorView = getWindow().getDecorView(); 
     int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
       | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
       | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
       | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
       | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
       | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
     decorView.setSystemUiVisibility(uiOptions); 
     decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { 
      @Override 
      public void onSystemUiVisibilityChange(int visibility) { 
       View decorView = getWindow().getDecorView(); 
       int uiOptions = View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
       decorView.setSystemUiVisibility(uiOptions); 
      } 
     }); 
    } 
} 

當所示的軟鍵盤條顯示,我可以用這個活,因爲他們隱藏鍵盤時dismissed.However如果對話片段是節目的同時顯示軟鍵盤,然後當兩個鍵盤和該對話框片段被解散,它們會留在應用程序的頂部。

我的3個問題是

是否有可能停止softkeyboard改變用戶界面模式?

是否可以通過更改UI模式來停止顯示DialogsFraments?

編輯:我用下面的代碼,看看鍵盤顯示

public static boolean isKeyBoardShown(){ 
    InputMethodManager imm = (InputMethodManager)currentActivity.getSystemService(Context.INPUT_METHOD_SERVICE); 
    if (imm.isAcceptingText()) { 
     return true; 
    } else { 
     return false; 
    } 
} 

- >我知道有一個變通的活動中的對話,但我不能看到一個或返工代碼在DialogFragment

工作,如果沒有可能,爲什麼應用程序會卡在了錯誤的UI模式時,有一個都顯示鍵盤和DialogFrament?

+0

您希望應用始終處於全屏模式並控制何時顯示軟鍵盤? –

+0

是的,這是正確的 –

+0

我發佈了一個答案 –

回答

22

1.解釋解決方案。

我從android api文檔中摘錄了以下引用。

Using Immersive Full-Screen Mode

啓用沉浸全屏模式下,你的活動繼續 接收所有觸摸事件。用戶可以沿系統欄通常出現的區域向內輕掃以顯示系統欄。 這將清除SYSTEM_UI_FLAG_HIDE_NAVIGATION標誌(以及 SYSTEM_UI_FLAG_FULLSCREEN標誌(如果應用)),以使系統欄變爲可見的 。這也會觸發你的View.OnSystemUiVisibilityChangeListener,如果設置的話。

首先,您在使用粘性浸入時不需要OnSystemUiVisibilityChangeListener

但是,如果你想在系統欄自動再次隱藏 在一段時間後,你可以改用 SYSTEM_UI_FLAG_IMMERSIVE_STICKY標誌。請注意,該標記的「粘性」版本 不會觸發任何偵聽器,因爲此模式下顯示的系統欄暫時爲 處於瞬態狀態。

recommendations for using sticky/non sticky immersion

如果你正在構建一個真正身臨其境的應用程序,在那裏你希望用戶 屏幕邊緣附近的互動,你不要指望他們 需要頻繁訪問到系統UI,請將IMMERSIVE_STICKY標誌 與SYSTEM_UI_FLAG_FULLSCREEN和 SYSTEM_UI_FLAG_HIDE_NAVIGATION結合使用。例如,這種方法可能是適用於遊戲或繪圖應用的 。

不過,你提到需要用戶在鍵盤,所以我的建議是:
Use Non-Sticky Immersion

如果你正在構建一個電子書閱讀器,新聞閱讀器,或一本雜誌,使用 身臨其境標誌結合SYSTEM_UI_FLAG_FULLSCREEN和 SYSTEM_UI_FLAG_HIDE_NAVIGATION。因爲用戶可能想要頻繁地訪問 操作欄和其他UI控件,但不是在翻閱內容時受到任何UI元素的困擾,因此IMMERSIVE是此用例的不錯選擇。


2.解決方案

我的解決辦法是設置您的視圖界面中的片段onActivityCreated。

我的例子取自ImmersiveModeFragment.java樣本。

@Override 
public void onActivityCreated(Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    final View decorView = getActivity().getWindow().getDecorView(); 
    decorView.setOnSystemUiVisibilityChangeListener(
      new View.OnSystemUiVisibilityChangeListener() { 
       @Override 
       public void onSystemUiVisibilityChange(int i) { 
        hideSystemUI(); 
       } 
      }); 
} 

創建一個單獨的方法來管理您從OnSystemUiVisibilityChangeListener()

調用從這裏non sticky immersion

private void hideSystemUI() { 
    // Set the IMMERSIVE flag. 
    // Set the content to appear under the system bars so that the content 
    // doesn't resize when the system bars hide and show. 
    mDecorView.setSystemUiVisibility(
     View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
     | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
     | View.SYSTEM_UI_FLAG_IMMERSIVE); 
} 

兩者然後可以再次onResume調用此方法的用戶界面。

onResume(){ 
    hideSystemUI(); 
} 

3.備用溶液。

如果粘性浸泡是你真正想要的,你需要嘗試不同的方法。

For sticky immersion

@Override 
public void onWindowFocusChanged(boolean hasFocus) { 
    super.onWindowFocusChanged(hasFocus); 
    if (hasFocus) { 
     decorView.setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 
      | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_FULLSCREEN 
      | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);} 
} 

我希望這能解決你的問題。

+0

如果你在這之後有任何鍵盤問題,請告訴我。我有代碼來管理這個。 –

+1

您的備用解決方案解決了我在幾個小時內苦苦掙扎的問題。謝謝! – MScott

+1

@MScott不客氣!這個網站讓我避免了許多這樣的鬥爭。我很高興它的幫助,並感謝這種反饋:) –

2

是否有可能停止softkeyboard改變用戶界面模式?

也許

是否有可能從改變UI模式停止DialogsFraments的表現?

是隻要你試着去了解你在做什麼

如果沒有可能,爲什麼應用程序會卡在了錯誤的UI模式時,有一個都顯示鍵盤和DialogFrament?

因爲問題的答案的

現在這是你的整體解決方案

電流/細緻地查看是誰在OS從,當一個視圖是模糊的需要UI可見性設置或不關於z順序的頂部,則setSystemUiVisibility()被設置爲其默認值。 小號Ø而是試圖圍繞

View decorView = getWindow().getCurrentFocus() != null ? 
       getWindow().getCurrentFocus() :getWindow().getDecorView(); 

和黑客只要您DialogFragment被駁回檢查上述線並重新調用您的無障礙UI代碼;因爲....猜測是明晰這一點

0

此修補程序以及另一個與軟鍵盤相關的修補程序包含在此庫的DialogFragment類中。只是延長它來代替標準庫:

https://github.com/marksalpeter/contract-fragment

庫的主要目的是委託功能添加到片段和DialogFragments是利用父/子片段關係,但你可以使用bug修復或複製/粘貼文件

相關問題