隐藏片段中的状态栏或使片段全屏
Hide Status bar in a fragment or make the fragment full screen
我有一个带有底部导航设置的 Kotlin 应用程序。
我目前有5个片段[ProfileFragment, SearchFragment, HomeFragment, SettingsFragment, WebViewFragment]
所有这些都只是空白片段。但是在我的个人资料片段中,我在页面的上半部分展示了一个 panaroma 小部件
我知道如何让我的整个应用程序全屏显示,但是在其他片段上,内容将隐藏在缺口显示下。至于内容,我指的是我雇主的标志,他想要的,毫无疑问。
所以,我尝试了另一种方法。我让应用程序全屏显示并在任何地方添加填充,内容隐藏在缺口下。现在,碰巧有各种各样的手机,没有缺口。内容看起来异常平淡,因为,好吧,没有缺口。
如果我对缺口显示器进行调整,非缺口显示器就会出现问题。反之亦然。
所以,我想,为什么不在我的应用程序中全屏显示所有活动,如果我可以拉伸 ProfileFragment 以覆盖状态栏,或者隐藏状态栏,那将是一个完美的解决方案。
是否有办法执行以下任一操作?
- 隐藏 ProfileFragment 上的状态栏
- 将片段拉伸到屏幕顶部
- 使片段全屏,不切断底部导航
您可以尝试在 Activity:
中添加此代码
// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the status bar is hidden, so hide that too if necessary.
actionBar?.hide()
更多信息在这里:https://developer.android.com/training/system-ui/status#kotlin
如果使用AppCompatActivity,还可以使用:
if(getSupportActionBar() != null) {
getSupportActionBar().hide();
}
在 onCreate 方法中。
AndroidX(支持库)有一个内置的 OnApplyWindowInsetsListener
可以帮助您确定 window 插入,例如顶部(状态栏)或底部插入(即键盘) 以设备兼容的方式。
由于插图适用于 API 21+,您必须手动获取低于该插图的插图。这是 Java (v8) 中的示例,希望您能掌握它:
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
View mainContainer = findViewById(R.id.main_container); // You layout hierarchy root
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ViewCompat.setOnApplyWindowInsetsListener(mainContainer , (v, insets) -> {
int statusBarHeight = 0;
if (!isInFullscreenMode(getWindow())) statusBarHeight = insets.getSystemWindowInsetTop();
// Get keyboard height
int bottomInset = insets.getSystemWindowInsetBottom();
// Add status bar and bottom padding to root view
v.setPadding(0, statusBarHeight, 0, bottomInset);
return insets;
});
} else {
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = 0;
if (resourceId > 0 && !isInFullscreenMode(getWindow())) {
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
View decorView = getWindow().getDecorView();
decorView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
decorView.getWindowVisibleDisplayFrame(r);
//get screen height and calculate the difference with the useable area from the r
int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
int bottomInset = height - r.bottom;
// if it could be a keyboard add the padding to the view
// if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
//set the padding of the contentView for the keyboard
mainContainer.setPadding(0, statusBarHeight, 0, bottomInset);
});
}
...
}
public static boolean isInFullscreenMode(Window activityWindow) {
return (activityWindow.getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN;
}
}
请注意,要使底部插图起作用,您必须告诉 Android 您的 activity 是可调整大小的,因此在 AndroidManifest.xml
:
<application
...>
<activity
android:name=".MainActivity"
...
android:windowSoftInputMode="adjustResize"/>
...
</application>
我有一个带有底部导航设置的 Kotlin 应用程序。
我目前有5个片段[ProfileFragment, SearchFragment, HomeFragment, SettingsFragment, WebViewFragment]
所有这些都只是空白片段。但是在我的个人资料片段中,我在页面的上半部分展示了一个 panaroma 小部件
我知道如何让我的整个应用程序全屏显示,但是在其他片段上,内容将隐藏在缺口显示下。至于内容,我指的是我雇主的标志,他想要的,毫无疑问。
所以,我尝试了另一种方法。我让应用程序全屏显示并在任何地方添加填充,内容隐藏在缺口下。现在,碰巧有各种各样的手机,没有缺口。内容看起来异常平淡,因为,好吧,没有缺口。
如果我对缺口显示器进行调整,非缺口显示器就会出现问题。反之亦然。
所以,我想,为什么不在我的应用程序中全屏显示所有活动,如果我可以拉伸 ProfileFragment 以覆盖状态栏,或者隐藏状态栏,那将是一个完美的解决方案。
是否有办法执行以下任一操作?
- 隐藏 ProfileFragment 上的状态栏
- 将片段拉伸到屏幕顶部
- 使片段全屏,不切断底部导航
您可以尝试在 Activity:
中添加此代码// Hide the status bar.
window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN
// Remember that you should never show the action bar if the status bar is hidden, so hide that too if necessary.
actionBar?.hide()
更多信息在这里:https://developer.android.com/training/system-ui/status#kotlin
如果使用AppCompatActivity,还可以使用:
if(getSupportActionBar() != null) {
getSupportActionBar().hide();
}
在 onCreate 方法中。
AndroidX(支持库)有一个内置的 OnApplyWindowInsetsListener
可以帮助您确定 window 插入,例如顶部(状态栏)或底部插入(即键盘) 以设备兼容的方式。
由于插图适用于 API 21+,您必须手动获取低于该插图的插图。这是 Java (v8) 中的示例,希望您能掌握它:
public class MainActivity extends AppCompatActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
View mainContainer = findViewById(R.id.main_container); // You layout hierarchy root
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
ViewCompat.setOnApplyWindowInsetsListener(mainContainer , (v, insets) -> {
int statusBarHeight = 0;
if (!isInFullscreenMode(getWindow())) statusBarHeight = insets.getSystemWindowInsetTop();
// Get keyboard height
int bottomInset = insets.getSystemWindowInsetBottom();
// Add status bar and bottom padding to root view
v.setPadding(0, statusBarHeight, 0, bottomInset);
return insets;
});
} else {
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = 0;
if (resourceId > 0 && !isInFullscreenMode(getWindow())) {
statusBarHeight = getResources().getDimensionPixelSize(resourceId);
}
View decorView = getWindow().getDecorView();
decorView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
Rect r = new Rect();
//r will be populated with the coordinates of your view that area still visible.
decorView.getWindowVisibleDisplayFrame(r);
//get screen height and calculate the difference with the useable area from the r
int height = decorView.getContext().getResources().getDisplayMetrics().heightPixels;
int bottomInset = height - r.bottom;
// if it could be a keyboard add the padding to the view
// if the use-able screen height differs from the total screen height we assume that it shows a keyboard now
//set the padding of the contentView for the keyboard
mainContainer.setPadding(0, statusBarHeight, 0, bottomInset);
});
}
...
}
public static boolean isInFullscreenMode(Window activityWindow) {
return (activityWindow.getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN;
}
}
请注意,要使底部插图起作用,您必须告诉 Android 您的 activity 是可调整大小的,因此在 AndroidManifest.xml
:
<application
...>
<activity
android:name=".MainActivity"
...
android:windowSoftInputMode="adjustResize"/>
...
</application>