Android 顶部应用栏阻止片段背景图像

Android top app bar blocking fragment background image

提问人:user19334054 提问时间:10/25/2023 更新时间:10/25/2023 访问量:30

问:

我正在开发一个 Android 应用程序,遇到了这个奇怪的问题。我有一个主要活动,它有一个导航抽屉和一个顶部应用栏,顶部应用栏是透明的,因此背景图像在搜索栏和导航抽屉按钮后面可见。问题在于,当我使用导航抽屉导航到不同的片段时,该片段的背景不会像主要活动背景那样一直延伸到屏幕顶部。 我在活动和您可以从导航抽屉导航到的片段上设置了自定义背景,但令人困惑的是,当您启动应用程序时,没有特定背景集的主屏幕片段可以完美地工作。

我也在想,让一个顶级应用栏由主要活动持有不是一个好主意,我应该为每个片段设置一个,但我无法做到这一点。

理想情况下,我希望每个片段都有一个单独的顶级应用程序标准,但如果你能帮助我解决这个主要问题,那已经对我有很大的帮助了。

以下是应用的屏幕截图和相关文件的代码片段:Home screen with background image set in main activity

Fragment with top app bar blocking background from extending all the way to the top

以下是相关文件:

activity_main.xml:

 <?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"


    android:background="@drawable/best_winter_aesthetic_phone_wallpaper_in_hd"
    tools:openDrawer="start">

    <include
        android:id="@+id/app_bar_main"
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
    />

    <com.google.android.material.navigation.NavigationView
        app:itemTextColor="@color/white"
        app:itemIconTint="@color/white"
        android:background="#80000000"
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
</androidx.drawerlayout.widget.DrawerLayout>

app_bar_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:fitsSystemWindows="true"
    >


    <com.google.android.material.appbar.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        android:background="@android:color/transparent">

        <com.google.android.material.appbar.MaterialToolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Dark"
            android:background="@android:color/transparent"
            app:titleTextColor="@android:color/black">

            <!-- Search bar -->
            <androidx.appcompat.widget.SearchView
                android:id="@+id/searchView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:iconifiedByDefault="false"
                app:queryHint="Search"
                android:textAppearance="@color/white"
                android:background="@drawable/semi_transparent_rounded_searchview_background"
                app:queryBackground="@android:color/transparent" />
        </com.google.android.material.appbar.MaterialToolbar>
    </com.google.android.material.appbar.AppBarLayout>


    <include layout="@layout/content_main" />



</androidx.coordinatorlayout.widget.CoordinatorLayout>

fragment_current_location.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:context=".presentation.CurrentLocationFragment"

    >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Home"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.5" />


</androidx.constraintlayout.widget.ConstraintLayout>

fragment_account.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".presentation.navigation.AccountFragment"
    android:background="@drawable/generic_background"
    >


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Account"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.5"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.5" />

</androidx.constraintlayout.widget.ConstraintLayout>

content_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:showIn="@layout/app_bar_main">

    <fragment
        android:background="@android:color/transparent"
        android:id="@+id/nav_host_fragment_content_home"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:defaultNavHost="true"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:navGraph="@navigation/mobile_navigation" />
</androidx.constraintlayout.widget.ConstraintLayout>

主题:.xml:

<resources xmlns:tools="http://schemas.android.com/tools">
    <!-- Base application theme. -->
    <style name="Theme.VibeCast" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
        <item name="colorPrimary">#801E1D1D</item>
        <item name="colorPrimaryVariant">#FFF0F0</item>
        <item name="colorOnPrimary">@color/white</item>
        <!-- Secondary brand color. -->
        <item name="colorSecondary">@color/teal_200</item>
        <item name="colorSecondaryVariant">@color/teal_700</item>
        <item name="colorOnSecondary">#1F1E1E</item>
        <!-- Status bar color. -->

        <!-- This is where you should define the status bar attributes -->

        <item name="android:statusBarColor">@android:color/transparent</item>
    </style>

    <style name="Theme.VibeCast.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>

    <style name="Theme.VibeCast.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />

    <style name="Theme.VibeCast.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
</resources>
Android XML Kotlin android-studio mdc-组件

评论


答:

0赞 TIMBLOCKER 10/25/2023 #1

事实上,这才是重点。您在 AccountFragment 中设置了一个自定义背景,该背景不是半透明的。如果您希望 Fragment 随心所欲地加载,只需删除 fragment_account.xml 中的行即可。这意味着背景将是半透明的。android:backgroundandroid:background="@drawable/generic_background"

为什么一开始可以看到半透明的背景与初始化 NavigationDrawer 的方式有关。看来你一开始没有显示任何片段。仅当选择一个选项卡时,才会加载 Fragment。这意味着抽屉的第一个状态不会加载任何 Fragment。为了防止这种情况,您可以将用于切换到 AccountFragment 的代码复制到您的 AccountFragment 中,并将其粘贴到 .执行此操作时,Android 会从您指定的 Fragment 开始,因此开头不会为空。onCreateNavigationDrawerActivity

评论

0赞 user19334054 10/27/2023
帐户片段的背景不是半透明的,这是我想要的。我希望紫色背景延伸到顶部应用栏之外。我在开始时显示了一个片段,只是将其换成另一个片段。构成主屏幕的第一个片段没有背景集,因此其视图仅显示在活动中设置的背景之上。