Android 活动背景的边到边主题可在片段转换期间隐藏状态栏稀松布

问题描述 投票:0回答:1

我有 1 个活动在

navHostFragment
中托管多个片段。为了在它们之间切换,我使用 androids 导航组件(即
navGraph
)。

现在我想启用边缘到边缘。我已经让它在静态情况下工作,但在转换期间(想想导航抽屉切换或 FAB 单击事件期间的动画),背景中似乎有一个(活动?)主题,状态栏稀松布仍然使用蓝色.

在导航抽屉切换期间,它仅在短时间内可见,给人一种闪烁的印象。

FAB 操作时间较长,显示蓝色状态栏颜色过长,无法接受,请参阅第二张附图。

转换顺序如下:

  • 第一个仪表板片段消失,露出蓝色状态栏
  • 第二个空白片段开始放大
  • 第二个空白片段覆盖状态栏
  • 第二个空白片段完全放大,蓝色状态栏位于它的“下方”

注意 - 使用和显示的容器转换转换尚未准备好,忘记看起来奇怪的 fab 和蓝色容器(fab 转换与蓝色状态栏问题无关,因为该问题也会出现,例如在初始应用程序启动)。

问题

所以我想它归结为如何定义和设置一个活动主题来改变状态栏颜色(透明或例如表面颜色)并教Android从一开始就使用它。

我现在用的是

<!--values/themes.xml -->
<style name="Base.Theme.App" parent="Theme.Material3.DayNight.NoActionBar">

v29

<!--v29/themes.xml -->
    <style name="Theme.App" parent="Base.Theme.App">
        <item name="android:statusBarColor">@android:color/transparent</item>
</style>

并体现:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
 ...
        android:theme="@style/Theme.App"
        tools:targetApi="34">
        <activity
            android:name=".ui.uielements.activities.MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

android android-fragments android-activity android-theme material-components-android
1个回答
0
投票

似乎删除

android:fitsSystemWindows="true"
根元素(在我的例子中是抽屉布局)上的
activity_main.xml
就成功了。

这清楚地表明我仍然不明白

android:fitsSystemWindows="true"
的原因和用途(在阅读和观看了有关它的所有内容之后),所以请随意发表评论...

无论如何,边到边在 Android 上很难 :/


我的设置的一些背景(仅包括对边到边重要的事情):

启用边到边:

MainActivity.kt

 override fun onCreate(savedInstanceState: Bundle?) {
        enableEdgeToEdge()
        super.onCreate(savedInstanceState)
        ...
}

activity_main.xml

<androidx.drawerlayout.widget.DrawerLayout 
...>

    <androidx.coordinatorlayout.widget.CoordinatorLayout
        android:fitsSystemWindows="true"
     ...>     <!-- here I removed the "fitsSystemWindows="true" flag -->

        <androidx.fragment.app.FragmentContainerView
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:fitsSystemWindows="true"
         .../>

        <com.google.android.material.floatingactionbutton.FloatingActionButton
         .../>

    </androidx.coordinatorlayout.widget.CoordinatorLayout>

    <com.google.android.material.navigation.NavigationView
        android:fitsSystemWindows="true"
     .../>

</androidx.drawerlayout.widget.DrawerLayout>

第一个片段(第二个等效片段):

dashboard_fragment_xml

<androidx.coordinatorlayout.widget.CoordinatorLayout
    android:fitsSystemWindows="true"
    ...>

    <include
        android:id="@+id/app_bar_layout"
        layout="@layout/default_appbar"/>

    <androidx.core.widget.NestedScrollView
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior">

    </androidx.core.widget.NestedScrollView>

</androidx.coordinatorlayout.widget.CoordinatorLayout>

default_appbar_xml

<com.google.android.material.appbar.AppBarLayout
    android:fitsSystemWindows="true"
    ...>

    <com.google.android.material.appbar.MaterialToolbar 
     ... />

</com.google.android.material.appbar.AppBarLayout>

theme.xml

<!--v29/themes.xml -->
    <style name="Theme.App" parent="Base.Theme.App">
        <item name="android:navigationBarColor">@android:color/transparent</item>
        <item name="android:statusBarColor">@android:color/transparent</item>
        <item name="android:windowLightStatusBar">?attr/isLightTheme</item>
    </style>
</style>
© www.soinside.com 2019 - 2024. All rights reserved.