【问题标题】:Android: Status Bar is WhiteAndroid:状态栏为白色
【发布时间】:2016-01-24 18:51:29
【问题描述】:

由于某种原因,状态栏现在是白色的。或者更确切地说,一种灰白色,另一种白色阴影用于在明亮的背景下隐约可见的图标。这是错误的,因为我的 appbarlayout 使用蓝色阴影作为其颜色。到目前为止,这一直工作正常,我不知道我做了什么导致这个。我尝试手动将 statusBarColor 设置为 colorPrimaryDark (#0277bd),但它不起作用。

我只是不知道为什么会发生这种情况。我正在粘贴我的活动的 layout.xml,也许有人可以提示我在这里做错了什么。

几点说明:

使用的主题没有改变它们的默认值,即使用原色设置。我将它们更改为我想要的正确的蓝色阴影,但是当我这样做时,一切正常。

我的布局.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:statusBarColor="@color/colorPrimaryDark"
    tools:context=".activities.ContactsActivity">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/contactsActivityAppbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fitsSystemWindows="true"
        android:statusBarColor="@color/colorPrimaryDark"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/contactsActivityToolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>
        <!-- app:layout_scrollFlags="scroll|enterAlways" -->

        <android.support.design.widget.TabLayout
            android:id="@+id/contactsActivityTabs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:tabIndicatorColor="@android:color/white"
            android:scrollbarStyle="insideOverlay"
            android:paddingBottom="1dp"
            android:background="@color/colorPrimary"/>

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

    <android.support.v4.view.ViewPager
        android:id="@+id/contactsTabsViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

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

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#0288d1</color>
    <color name="colorPrimaryDark">#0277bd</color>
    <color name="colorAccent">#FF4081</color>
</resources>

styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

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

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

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />

</resources>

编辑:好的,找到了一个有趣的解决方案,很想了解它,而不是仅仅依靠它。此外,从长远来看,这可能不是最佳答案。

无论如何,在styles.xml 中的基本应用程序主题(AppTheme)中,我添加了以下行:

<item name="android:windowBackground">@color/colorPrimaryDark</item>

它起作用了,它为我没有专门指定颜色的所有内容制作了背景。但是它也让状态栏变成了那种颜色,所以我把我自己的背景添加到其他东西上来修复它们。

不过,我觉得这不是理想的解决方案,我希望获得更多反馈。此外,即使之前没有这条线,它也可以很好地为状态栏着色。我不知道我做了什么来破坏它。

谢谢。

编辑:这是活动代码。谢谢。

import android.content.Intent;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;

import io.craigmiller160.contacts5.R;
import io.craigmiller160.contacts5.fragments.ContactsGroupsFragmentPage;
import io.craigmiller160.contacts5.fragments.ContactsListFragmentPage;
import io.craigmiller160.contacts5.fragments.ContactsTabsPagerAdapter;

public class ContactsActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);

        Toolbar toolbar = (Toolbar) findViewById(R.id.contactsActivityToolbar);
        setSupportActionBar(toolbar);

        ViewPager viewPager = (ViewPager) findViewById(R.id.contactsTabsViewPager);

        ContactsTabsPagerAdapter adapter = new ContactsTabsPagerAdapter(getSupportFragmentManager());
        adapter.addFragmentPage(new ContactsListFragmentPage(), "Contacts");
        adapter.addFragmentPage(new ContactsGroupsFragmentPage(), "Groups");
        viewPager.setAdapter(adapter);

        TabLayout tabLayout = (TabLayout) findViewById(R.id.contactsActivityTabs);
        tabLayout.setupWithViewPager(viewPager);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.displaySettings) {
            Intent intent = new Intent(this, DisplaySettingsActivity.class);
            startActivity(intent);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

【问题讨论】:

  • 只是好奇。你的 Activity 扩展了 AppCompatActivity,对吧?
  • 您也可以发布您的清单和活动代码吗?此外,您应该从布局 xml 中删除 android:statusBarColor="@color/colorPrimaryDark"
  • android:fitsSystemWindows="true" 是可疑的。用于在状态栏下绘制Activity或组件,结合透明状态栏完成。如果您从某个地方复制了部分代码,您可能错过了导致问题的某些内容。所以,正如我所说,请发布您的活动代码,或者至少只是您认为相关的部分。
  • 添加了代码。谢谢。

标签: android


【解决方案1】:
<item name="android:statusBarColor">@android:color/transparent</item>

您将在 values/styles/styles.xml(v21) 中看到那行代码。删除它并解决问题

【讨论】:

    【解决方案2】:

    你可以通过这个来实现。 转到您的 style.xml(v21) 并更改颜色

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

    希望这能解决您的问题。

    【讨论】:

    • 如果这对您有用,然后将其标记为正确,以便它也可以帮助其他人。
    【解决方案3】:

    试试这个作为你的 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"
        tools:context=".activities.ContactsActivity">
    
        <android.support.design.widget.AppBarLayout
            android:id="@+id/contactsActivityAppbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
    
            <android.support.v7.widget.Toolbar
                android:id="@+id/contactsActivityToolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="?attr/colorPrimary"
                app:popupTheme="@style/AppTheme.PopupOverlay" />
    
            <android.support.design.widget.TabLayout
                android:id="@+id/contactsActivityTabs"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:tabIndicatorColor="@android:color/white"
                android:scrollbarStyle="insideOverlay"
                android:paddingBottom="1dp"
                android:background="?attr/colorPrimary"/>
    
        </android.support.design.widget.AppBarLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/contactsTabsViewPager"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"/>
    
    </android.support.design.widget.CoordinatorLayout>
    

    我认为您可能已经多次设置主题并且它本身令人困惑。

    如果一切正常,Status 栏的颜色将来自colorPrimaryDark

    【讨论】:

      【解决方案4】:

      在styles.xml中,

      替换这个:

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

      与:

      <style name="NoActionBar">
          <item name="colorPrimary">@color/colorPrimary</item>
          <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
          <item name="colorAccent">@color/colorAccent</item>
          <item name="windowActionBar">false</item>
          <item name="windowNoTitle">true</item>
      </style>
      

      并在Manifest.xml中进行相应的修改

      【讨论】:

        【解决方案5】:

        我不能说我已经详细研究过这个问题,但其他答案都没有建议“windowDrawsSystemBarBackgrounds” - 这似乎不需要设置状态栏就可以工作明确的颜色。因此,values-v21/styles.xml:

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

        【讨论】:

          【解决方案6】:

          我遇到了这个确切的问题。 我通过更改应用主题以扩展 NoActionBar AppCompat 样式来修复它:

          <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
              <item name="colorPrimary">@color/primary</item>
              <item name="colorPrimaryDark">@color/primary_dark</item>
              <item name="colorAccent">@color/accent</item>
              <item name="android:windowBackground">@color/alabaster</item>
          </style>
          

          我的活动布局是:

          <?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"
          tools:ignore="MergeRootFrame">
          
          <android.widget.RelativeLayout
              android:id="@+id/chat_container"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              app:layout_behavior="@string/appbar_scrolling_view_behavior" />
          
          <android.support.design.widget.AppBarLayout
              android:id="@+id/appbar"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:theme="@style/AppTheme.AppBarOverlay">
          
              <android.support.v7.widget.Toolbar
                  android:id="@+id/toolbar"
                  android:layout_width="match_parent"
                  android:layout_height="?attr/actionBarSize"
                  android:background="?attr/colorPrimary"
                  app:layout_scrollFlags="scroll|enterAlways|snap"
                  app:popupTheme="@style/AppTheme.PopupOverlay">
          
              </android.support.v7.widget.Toolbar>
          </android.support.design.widget.AppBarLayout>
          

          RelativeLayout 包含一个 Fragment,它在 RelativeLayout 中只有一个 RecyclerView。所以删除 android:statusBarColor="@color/colorPrimaryDark" 和 fitSystemWindow xml 行并更改您的主题,我认为应该可以。

          【讨论】:

            【解决方案7】:

            在任何活动中实现这一目标

            1. 添加样式:
            <style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
                <item name="colorPrimary">@color/colorPrimary</item>
                <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
                <item name="colorAccent">@color/colorAccent</item>
                <item name="android:statusBarColor">@android:color/transparent</item>
                <item name="android:windowBackground">@android:color/white</item>
            </style>
            
            1. 在 Activity 的 XML 中使用 CoordinatorLayout 作为根布局

            2. oncreate()方法中,setcontentview之前使用

            window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE 或 查看.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2023-03-30
              • 2021-09-25
              • 1970-01-01
              • 1970-01-01
              • 2017-08-16
              • 2017-11-23
              • 1970-01-01
              • 2022-11-28
              相关资源
              最近更新 更多