- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我的应用程序有一个 Activity ,为每个部分托管不同的 fragment 。我最近通过将 fitSystemWindows
设置为 true
使状态栏变得半透明,这已将其设置为应用程序的背景色。这对于具有工具栏的 fragment 来说很好,颜色匹配,如下所示:
但是我的一个 fragment 有一张照片和一个半透明的工具栏,所以我想让照片也占据状态栏的空间,而不是背景颜色。
我认为解决方案是仅针对该 fragment 将 fitSystemWindows
设置为 false
,然后手动向半透明工具栏添加填充。以编程方式执行此操作似乎没有效果,我可能做错了什么?
这是我的主要 Activity 布局:
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_parent_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:fitsSystemWindows="true">
<!-- Container for various fragment layouts, including nav drawer and toolbar -->
</RelativeLayout>
然后从我 fragment 的 onCreateView() 中:
RelativeLayout daddyLayout = (RelativeLayout)getActivity().findViewById(R.id.main_parent_view);
daddyLayout.setFitsSystemWindows(false);
daddyLayout.invalidate();
这似乎没有效果,像这样:
如果我在 main_parent_view
中将 fitSystemWindows
设置为 false,状态栏填充就会消失并且有效,但显然会影响每个 fragment 。
最佳答案
好吧,你在那里处于两难境地,因为一方面你需要应用插图(因为 Toolbar
应该被正确填充),另一方面你不应该不 应用 insets(因为你希望 ImageView
在状态栏下绘制)。
原来框架为这种情况提供了一个很好的 API:
ViewCompat.setOnApplyWindowInsetsListener(toolbar, (v, insets) -> {
((ViewGroup.MarginLayoutParams) v.getLayoutParams()).topMargin =
insets.getSystemWindowInsetTop();
return insets.consumeSystemWindowInsets();
});
假设您的根布局具有 android:fitsSystemWindows="true"
,现在适当的插入将应用于您的工具栏
仅,而不是ImageView
。
但是,有个问题。
问题是您的根布局是 RelativeLayout
,它不会向其子级发送任何关于 insets 的信息。它的兄弟布局(LinearLayout
、FrameLayout
)也没有。
如果您有一个“物质化”布局(CoordinatorLayout
、DrawerLayout
)作为根布局,那么子级将被分配那些窗口插图。
另一种选择是继承 RelativeLayout
并将 WindowInsets
分派(dispatch)到 child 手动。
@TargetApi(Build.VERSION_CODES.KITKAT_WATCH)
@Override
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
int childCount = getChildCount();
for (int index = 0; index < childCount; index++)
getChildAt(index).dispatchApplyWindowInsets(insets); // let children know about WindowInsets
return insets;
}
可以看到this answer以获得与您的要求完全相同的详细解释。
关于android - fitSystemWindows 以编程方式实现状态栏透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28387289/
我有一个 View 需要锚定到屏幕底部。在全屏模式下,它需要位于最底部,但在临时非全屏模式(用户点击)期间,它需要向上移动以免被系统栏隐藏。文档说设置 android:fitsSystemWindow
我的应用程序有一个 Activity ,为每个部分托管不同的 fragment 。我最近通过将 fitSystemWindows 设置为 true 使状态栏变得半透明,这已将其设置为应用程序的背景色。
我很难理解 fitsSystemWindows 的概念,因为它会根据 View 做不同的事情。根据官方文档,这是一个 Boolean internal attribute to adjust view
我需要图像显示在状态栏下方(状态栏必须是透明的,不知道怎么做)但我无法让它工作,我已经尝试了很多布局示例。 这是我的 xml 布局:
我正在使用一个在主要 Activity 中有 3 个选项卡的应用程序。第二个选项卡的 fragment 有一个带有标题的 NestedScrollView,应该适合系统窗口。选项卡 fragment
我有一个使用 fitSystemWindows 能够在导航栏和状态栏后面绘制背景的应用程序 - 不幸的是,SnackBar 似乎忽略了容器中的 fitSystemWindows=true。我将问题归结
我有一个绑定(bind)到 ViewPager 的 MotionLayout 过渡。 private val pageChangedListener = object : SimpleOnPageCh
我有一个透明的状态/导航栏,当我使用默认布局(顶部/左侧)放置一个撰写元素时,它被放置在状态栏下方。在 xml 中我使用 fitsSystemWindows要解决这个问题,我怎样才能在 jetpack
我无法让我的 ViewPager 页面尊重状态栏高度。 我的 ViewPager 有几个页面,其中一个页面上有一个图像需要放在半透明状态栏下。其余的页面只需要一个彩色状态栏,所以我的想法是在 frag
我正在尝试在状态栏后面绘制 View ,如下所示: 我尝试使用推荐的技术来产生这种效果,但我明白了: 从屏幕截图中可以清楚地看出,我的应用内容都没有被绘制在状态栏后面。 有趣的是,Nav Drawer
当使用来自新的 Android 4.4 KitKat API 的半透明状态栏和导航栏时,将 fitsSystemWindows="true" 和 clipToPadding="false" 设置为 L
我是一名优秀的程序员,十分优秀!