0

프리 스케이프 (상태 표시 줄 및 탐색 표시 줄 없음)에서 몰입 형 모드로 이동하고 포트 상태에서 몰입 형 모드 (리턴 상태 표시 줄 및 탐색 표시 줄 사용)를 비활성화하는 make 응용 프로그램을 시도해보십시오. 활동을 다시 시작하지 않고 (onCreate는 한 번만 호출 됨). 내 문제를 보여주기 위해 작은 예제 응용 프로그램을 작성했습니다.랜드 스케이프 모드에서만 몰입 형 모드 사용하기

의 AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="test.com.immersivetest"> 
    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity 
      android:name=".MainActivity" 
      android:configChanges="orientation|screenSize"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    android:padding="0dp" 
    tools:context="test.com.immersivetest.MainActivity"> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#ffff0000" 
     /> 
</RelativeLayout> 

MainActivity.java

package test.com.immersivetest; 

import android.content.res.Configuration; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 

public class MainActivity extends AppCompatActivity { 

    private View activity; 
    private View decorView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     activity = findViewById(R.id.activity_main); 
     decorView = this.getWindow().getDecorView(); 
     System.out.println("On Crate"); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     updateForOrientation(newConfig.orientation); 
    } 

    public void updateForOrientation(int orientation) { 
     if (orientation == Configuration.ORIENTATION_LANDSCAPE) { 
      hideSystemUI(); 
     } else if (orientation == Configuration.ORIENTATION_PORTRAIT) { 
      showSystemUI(); 
     } 
    } 



    private void hideSystemUI() { 
     System.out.println("Hide UI"); 
     activity.setFitsSystemWindows(false); 
     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 // hide nav bar 
         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar 
         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY); 

    } 

    private void showSystemUI() { 
     activity.setFitsSystemWindows(true); 
     decorView.setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE 
         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 
         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); 
    } 


} 

내 문제를 볼 수있는 단계 :

1) 앱을 세로 모드로 시작하면 전체 화면에 빨간색 배경의 자식 RelativeLayout이 제목 표시 줄, 상태 표시 줄, 탐색 줄과 함께 표시됩니다. 맞습니다. 스크린 샷

2) 가로로 회전. 그리고 다시 올바른 결과를 보았습니다 : titlebar, statusbar, navigationbar없이 몰입 형 모드에서 빨간색 배경을 가진 Child RelativeLayout.

3) 세로 방향으로 회전하십시오. 정확한 결과를 확인하십시오. 첫 번째 단계의 스크린 샷과 같습니다.

4) 다시 가로 방향으로 회전하십시오. 그리고 나는 정확한 결과를 보지 못합니다. 하위 RelativeLayout은 부모 크기로 확장되지 않습니다. 화면의 상단과 하단에 빈 필드가 표시됩니다. 문제가있는 스크린 샷

어떻게 고칠 수 있습니까? 왜 모든 회전이 처음으로 올바르지 않은 크기 조정 자식 RelativeLayout과 맞지 않는 이유는 무엇입니까?

p.s. 최소 SDK 버전 19.

답변

0

해결책을 직접 찾았습니다.) https://developer.android.com/training/system-ui/immersive.html#nonsticky에서 발췌 문장을 받았습니다. 그리고 제대로 작동하지 않습니다. showSystemUI()에서 플래그를 변경하고 완벽하게 작동합니다!

private void showSystemUI() { 
    activity.setFitsSystemWindows(true); 
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE); 
} 

하지만 액션 바를 사용하지 않기 때문에 내 앱에서 작동합니다. 동작 표시 줄이 활성화 된 경우 표시되는 동작 표시 줄이 올바르지 않습니다. 나는 이유를 모른다. 어떤 방법으로 시작 응용 프로그램에서 플래그를 확인하고 그것은 SYSTEM_UI_FLAG_VISIBLE 만있다.

누군가 작업 표시 줄이있는 앱용 솔루션을 가지고 있다면 해결책을 알게되어 기쁩니다.