2015-09-24 101 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修复或复制/粘贴文件

相关问题