프리 스케이프 (상태 표시 줄 및 탐색 표시 줄 없음)에서 몰입 형 모드로 이동하고 포트 상태에서 몰입 형 모드 (리턴 상태 표시 줄 및 탐색 표시 줄 사용)를 비활성화하는 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.