2016-05-22 4 views
2

私はビデオプレーヤーアプリケーションを開発しており、問題に直面しています。私はフルスクリーンボタンを含むカスタムビデオコントローラを持っており、フルスクリーンモードに入るときにシステムUI(ナビゲーションとステータスバー)を非表示にしたい。私はthisのような何かをしようとしましたが、正しく動作しません。アプリケーションを起動すると、次のスクリーンショットのようなプレーヤーが表示されます。 enter image description here フルスクリーンボタンをクリックすると、向きが横向きに変わり、システムのUIは非表示になりますが、プレーヤーはフルスクリーンになりません。 Status bar hides and navigation bar hides too, but player doesn't take the whole screen また、ビデオコントローラを表示する代わりに、システムのUIが表示されます。 System UI shows when I tap on screen これを正しく実装するにはどうすればよいですか?以下は、システムUIを示す/フルスクリーンや隠ぺいのための私の方法です:AndroidのシステムUIを正しく隠す方法

@Override 
public void toggleFullscreen() { 
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mVideoContainer.getLayoutParams(); 
    if (!mFullscreen) { 
      setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     hideSystemUI(); 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     params.width = metrics.widthPixels; 
     params.height = metrics.heightPixels; 
     params.setMargins(0, 0, 0, 0); 
    } else { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     showSystemUI(); 
     DisplayMetrics metrics = new DisplayMetrics(); 
     getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     params.width = metrics.widthPixels; 
     params.height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, metrics); 
      params.setMargins(0, 0, 0, 0); 
    } 
    mVideoContainer.setLayoutParams(params); 
    mFullscreen = !mFullscreen; 
} 

private void hideSystemUI() { 
    View decorView = getWindow().getDecorView(); 
    int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
    if (Build.VERSION.SDK_INT < 16) { 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN) 
    } else { 
     uiOptions |= View.SYSTEM_UI_FLAG_FULLSCREEN; 
    } 
    decorView.setSystemUiVisibility(uiOptions); 
} 

private void showSystemUI() { 
    View decorView = getWindow().getDecorView(); 
    decorView.setSystemUiVisibility(0); 
} 

は、ここに私のレイアウトです:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:id="@+id/video_container" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" > 

    <FrameLayout 
     android:id="@+id/videoSurfaceContainer" 
     android:layout_width="match_parent" 
     android:layout_height="300dp" > 

     <SurfaceView 
      android:id="@+id/videoSurface" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" /> 
    </FrameLayout> 
</LinearLayout> 

答えて

4

私はナビゲーションバーとステータスバーを非表示にするすべての活動でこれを含める:

public void hideToolBr(){ 

     // BEGIN_INCLUDE (get_current_ui_flags) 
     // The UI options currently enabled are represented by a bitfield. 
     // getSystemUiVisibility() gives us that bitfield. 
     int uiOptions = getWindow().getDecorView().getSystemUiVisibility(); 
     int newUiOptions = uiOptions; 
     // END_INCLUDE (get_current_ui_flags) 
     // BEGIN_INCLUDE (toggle_ui_flags) 
     boolean isImmersiveModeEnabled = 
       ((uiOptions | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY) == uiOptions); 
     if (isImmersiveModeEnabled) { 
      Log.i(Constants.TAG_DEF, "Turning immersive mode mode off. "); 
     } else { 
      Log.i(Constants.TAG_DEF, "Turning immersive mode mode on."); 
     } 

     // Navigation bar hiding: Backwards compatible to ICS. 
     if (Build.VERSION.SDK_INT >= 14) { 
      newUiOptions ^= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; 
     } 

     // Status bar hiding: Backwards compatible to Jellybean 
     if (Build.VERSION.SDK_INT >= 16) { 
      newUiOptions ^= View.SYSTEM_UI_FLAG_FULLSCREEN; 
     } 

     // Immersive mode: Backward compatible to KitKat. 
     // Note that this flag doesn't do anything by itself, it only augments the behavior 
     // of HIDE_NAVIGATION and FLAG_FULLSCREEN. For the purposes of this sample 
     // all three flags are being toggled together. 
     // Note that there are two immersive mode UI flags, one of which is referred to as "sticky". 
     // Sticky immersive mode differs in that it makes the navigation and status bars 
     // semi-transparent, and the UI flag does not get cleared when the user interacts with 
     // the screen. 
     if (Build.VERSION.SDK_INT >= 18) { 
      newUiOptions ^= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; 
     } 

     getWindow().getDecorView().setSystemUiVisibility(newUiOptions); 
     //END_INCLUDE (set_ui_flags) 

    } 

その後、私の活動ののonCreateメソッドでは、私がsetContentView()

の後にこれを呼び出します

すべてのユーザーは、下からスワイプするか、上からスワイプしてステータスバーまたはナビゲーションバーを表示します。 Googleはこの「没入型モード」と呼んでいます。これにより、開発者はデバイスの画面の不動産を完全に利用することができます。

// This snippet shows the system bars. It does this by removing all the flags 
// except for the ones that make the content appear under the system bars. 
private void showSystemUI() { 
    mDecorView.setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
      | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
      | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
} 

あなたはより多くの情報hereを見つけることができます。

が、これは、システムのUIを示して呼び出し、没入モードのグーグルの例から撮影します。

編集:

は同様にあなたのstyles.xmlにこれを追加

<style name="YourTheme.NoActionBar"> 
    <item name="windowActionBar">false</item> 
    <item name="windowNoTitle">true</item> 
    <item name="android:colorForeground">@color/colorPrimaryDark</item> 
</style> 
+0

それはまだ –

+0

@OlegRyabtsevは、あなたのレイアウトが一致してい:(ナビゲーションバーの場所でフルスクリーンするために入力した後の空きスペースを残しあなたのxmlの中で、あなたのXMLの 'android:layout_height =" match_parent "'の親は? –

+0

私はlayout_height = "match_parent"を持つルートレイアウトとしてLinearLayoutを持っており、この中には300dpの高さを持つFrameLayoutがあります。マッチしようとするフルスクリーンボタンをクリックしたときにFrameLayoutのサイズが動的に変更される –

関連する問題