Android:透明状态栏,带有动态的动作条颜色和DrawerLayout

我有一个DrawerLayout的活动。 我们的客户要求我们根据从DrawerLayout选择的项目动态更改此活动的动作栏颜色和相应的状态栏颜色。 这很容易完成。 但是,我的问题是,当我动态更改状态栏颜色时,我无法保持状态栏透明。 当我打开抽屉时,彩色状态栏会覆盖DrawerLayout的顶部,如下所示:

错误的布局

不过,我希望我的DrawerLayout看起来像这样:

正确的布局

这我可以做以下行:

<item name="android:windowTranslucentStatus">true</item>

但是,我的问题不是我无法设置状态栏的透明度。 我的问题是状态栏和动作栏颜色的动态更改不适用于windowTranslucentStatus 。 即使在我调用getWindow().setStatusBarColor()之后,我的状态栏颜色仍然是colorPrimaryDarkcolorPrimaryDark状态栏上可见的芥黄色getWindow().setStatusBarColor()

现在,我遵循这个教程和这个和这个stackoverflow问题之间的许多其他问题,但无法解决问题。 所有这些文章都说,一旦将windowTranslucentStatus设置为trueActionBar将移动到状态栏下方的顶部(以便状态栏与操作栏重叠)。 之后,我应该可以在操作栏中添加一些填充,只需更改操作栏颜色,也会导致颜色相同的较暗状态栏,因为状态栏实际上是半透明的并与我的操作栏重叠。 但是,由于某种原因,这不会发生在我的情况。 操作栏保留在是否将fitsSystemWindows设置为truefalse或完全删除属性的位置。 操作栏总是在状态栏的下方,当然,如果我设置透明度,它始终是黄色的。

我也尝试以编程方式更改状态栏颜色时设置Alpha。 这确实使状态栏有点透明,但它看起来很奇怪,因为它不再是黑暗的。 移除CoordinatorLayout也无济于事。 我花了几个小时试图解决这个问题,现在非常沮丧。 任何帮助是极大的赞赏。

我的activity_main

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.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:fitsSystemWindows="true"
tools:openDrawer="start">

<include
    layout="@layout/app_bar_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

<android.support.design.widget.NavigationView
    android:id="@+id/nav_view"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:fitsSystemWindows="true">

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

    <android.support.v7.widget.RecyclerView
        android:id="@+id/nav_menu_recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="@dimen/nav_header_height"
        android:clipToPadding="false"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/size_14dp"
        app:layoutManager="LinearLayoutManager" />
</android.support.design.widget.NavigationView>

</android.support.v4.widget.DrawerLayout>

这里是我的app_bar_main的XML:

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/AppTheme.AppBarOverlay"
    app:elevation="0dp">


    <FrameLayout
        android:id="@+id/toolbar_container"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        app:popupTheme="@style/AppTheme.PopupOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary" />

        <com.quintype.sakshipost.Widgets.CustomMaterialSearchView
            android:id="@+id/search_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </FrameLayout>

</android.support.design.widget.AppBarLayout>

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

</android.support.design.widget.CoordinatorLayout>

你的问题是由于getWindow().setStatusBarColor()不适用于DrawerLayout 。 为了让您的状态栏保持半透明并能够更改颜色,您必须按照以下步骤操作:

在您的v21/styles.xml文件中添加/修改以下主题,如下所示:

<style name="AppTheme.NoActionBar" parent="AppTheme">
    <item name="windowActionBar">false</item>
    <item name="windowNoTitle">true</item>
    <item name="android:windowTranslucentStatus">true</item>
</style>

这是标准DrawerLayout使用的主题(当然,假设您在具有DrawerLayout的活动中使用此主题)。 正如你已经知道的那样,这将使你的状态栏变得半透明。

然后,取下android:fitsSystemWindows="true"CoordinatorLayoutapp_bar_main

接下来,无论您在何处更改工具栏/状态栏的颜色,都使用drawerLayout.setStatusBarBackground(colorDrawable)使用您用于工具栏的相同颜色(当然,假设您的DrawerLayout的引用称为drawerLayout )。 请注意, drawerLayout.setStatusBarBackground()方法使用一个Drawable对象,与window.setStatusBarColor()方法不同,它采用int颜色,所以您可能必须使用类似下面的方法将颜色转换为drawable:

new ColorDrawable(ContextCompat.getColor(getApplicationContext(), R.color.colorPrimary))

这将确保您的状态栏是半透明的,并且可以让它更改颜色。 希望你能够得到这个工作。


正如doc在这里所说的,不能设置FLAG_TRANSLUCENT_STATUS。

为使此生效,该窗口必须使用FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS绘制系统栏背景,并且不得设置FLAG_TRANSLUCENT_STATUS。


我在我的应用程序中这样做。

<style name="AppTheme" parent="Theme.AppCompat.Dark">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>

colorPrimary将设置状态栏颜色,但只有在您重新启动活动时才会显示。

所以将其设置为透明黑色,然后在代码中重新启动活动。 您可以在样式中制作多个样式,使用不同的colorPrimary值,然后在您的活动中执行此操作。

//onClick or condition statement here
setTheme(R.style.AppThemeLight);
setContentView(R.layout.activity_link_manager_light);
restart();


public void restart(){
Intent i = getBaseContext().getPackageManager()
            .getLaunchIntentForPackage( getBaseContext().getPackageName() );
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(i);
}

我不认为你需要重置contentview,除非你也改变布局,不确定你可以尝试重置它到相同的布局,如果它没有它的工作。

这绝对适合我,但我从来没有尝试过使用透明的值。

您可以使用此方法重置整个应用程序主题并切换到具有不同颜色硬编码的新布局,只需在布局上保留所有ID,并在代码中您将获得正确的ID,只要您参考findViewByID在您将setContentView设置为具有您在其中调用的ID的正确布局后。 每个布局的ID都不同,但是您总是会在调用findViewByID时获取当前使用setContentView设置的布局的ID。

您还可以将当前主题保存到sharedpref文件,并在调用setContentView之前使用开关在applaunch上设置主题(否则状态栏颜色不会更改)

考虑这个代码。 顺便说一下,这是onCreate的开始附近

String Theme;
    SaveData = getSharedPreferences(SaveFileName,0);
    Theme = SaveData.getString("Theme","Default Theme");
switch(Theme){
        case "Light Theme":
            setTheme(R.style.AppThemeLight);
            setContentView(R.layout.activity_link_manager_light);
            ListTextViewID = R.id.AppListTextViewLight;
            ListRowID = R.layout.app_list_item_light;
            break;

我在设置contentview之前设置apptheme的方式是状态栏颜色更改工作的原因。

链接地址: http://www.djcxy.com/p/92467.html

上一篇: Android: Transparent status bar with dynamic actionBar colors and DrawerLayout

下一篇: What do you do when you find a bug in other function when develop a function?