Статусбар не прозрачный но белый

Чтобы протестировать kotlin с anko DSL, я решил запустить новый проект в последней версии Android Studio Ide (2.1.3), используя плагин kotlin (1.0.3) и последнюю версию библиотеки anko (0.9).

Я использовал проект по умолчанию Navigation Drawer Activity, поэтому мне просто пришлось преобразовать основной xml в anko.

Это XML:

<?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">

    <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.support.design.widget.AppBarLayout
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            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:popupTheme="@style/AppTheme.PopupOverlay" />

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

        <RelativeLayout
            xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:tools="http://schemas.android.com/tools"
            xmlns:app="http://schemas.android.com/apk/res-auto"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingBottom="@dimen/activity_vertical_margin"
            app:layout_behavior="@string/appbar_scrolling_view_behavior" >

            <TextView
                android:text="Hello World!"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </RelativeLayout>

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

    <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"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />

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

И это работает отлично, как вы можете видеть здесь: XML

С помощью anko я попытался скопировать каждую деталь из xml, получив следующий код:

class MainActivityUi: AnkoComponent<MainActivity> {
    override fun createView(ui: AnkoContext<MainActivity>) = with(ui) {

        drawerLayout {
            id = R.id.drawer_layout
            fitsSystemWindows = true

            coordinatorLayout {

                appBarLayout(R.style.AppTheme_AppBarOverlay) {

                    toolbar {
                        id = R.id.toolbar
                        backgroundColor = colorAttr(R.attr.colorPrimary)
                        popupTheme = R.style.AppTheme_PopupOverlay
                    }.lparams(height=dimenAttr(R.attr.actionBarSize),width=matchParent)

                }.lparams(width=matchParent)

                relativeLayout {
                    padding = dip(16)

                    textView("Hello World!")

                }.lparams(height=matchParent,width=matchParent) {
                   behavior = AppBarLayout.ScrollingViewBehavior()
                }

            }.lparams(height=matchParent,width=matchParent)

            navigationView {
                id = R.id.nav_view
                inflateHeaderView(R.layout.nav_header_main)
                inflateMenu(R.menu.activity_main_drawer)

            }.lparams(height=matchParent) {
                gravity = Gravity.START
                fitsSystemWindows = true
            }
        }
    }
}

И вместо этого я получаю эту белую строку состояния: АНКО

Единственными изменениями, которые я сделал, было изменение MainActivity setContentView(R.layout.activity_main) на MainActivityUi.setContentView(this).

Итак, мой вопрос: почему это происходит, когда они имеют одинаковые взгляды и макеты? и как я могу это исправить?

РЕДАКТИРОВАТЬ: я использую проект по умолчанию, который создается, когда в Android Studio вы выбираете новый проект, а затем вы выбираете DrawerNavigationActivity. Если в setContentView я выбираю отображение вида xml, строка состояния отображается синим цветом (первый снимок экрана), но если я хочу показать представление anko, я получаю белую строку состояния.

В обоих случаях я использую одни и те же темы, цвета и т. Д., А при использовании макета XML все работает отлично, поэтому это должно быть проблемой Анко

3 ответа

Стараться сделать

window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)

внутри onCreate()

это сработало для меня

Ссылка

РЕДАКТИРОВАТЬ: Также мой код

drawerLayout {
  lparams(width = matchParent, height = matchParent)

  coordinatorLayout {
     setPadding(0, dip(24), 0, 0)

     appBarLayout {
        toolbar {
           backgroundColor = primaryColor
           setTitleTextColor(primaryColorText)
        }.lparams(width = matchParent, height = dip(toolbar_size))

     }.lparams(width = matchParent, height = dip(toolbar_size))

  }.lparams(width = matchParent, height = matchParent)

  navigationView {

  }.lparams(width = dip(302), height = matchParent) {
     gravity = Gravity.START
  }
}

Вы ошибаетесь, думая, что строка состояния transparent по умолчанию.

Согласно этому изображению

взяты из справочника разработчиков Android. Проверьте: https://developer.android.com/training/material/theme.html

Цвет строки состояния зависит от того, что вы определили в colors.xml или же styles.xml в values папка как colorPrimaryDark, так что это не прозрачно.

Ваша проблема не в white цвет в строке состояния, который подходит для прозрачности, но недостаточно знаний об использовании тем в приложениях Android.

РЕДАКТИРОВАТЬ: Изменение цвета строки состояния (Java):

Window window = activity.getWindow();

// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

// finally change the color
window.setStatusBarColor(activity.getResources().getColor(R.color.my_statusbar_color));

или же

 public void setStatusBarColor(View statusBar,int color){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
           Window w = getWindow();
           w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
           //status bar height
           int actionBarHeight = getActionBarHeight();
           int statusBarHeight = getStatusBarHeight();
           //action bar height
           statusBar.getLayoutParams().height = actionBarHeight + statusBarHeight;
           statusBar.setBackgroundColor(color);
     }
}

Надеюсь, это поможет

Это не ваша проблема в статусбаре.
Поправьте меня, если я ошибаюсь, я полагаю, что вы используете версию Cyanogenmod OS 13.0 по виду вашего символа батареи. Вернитесь к теме по умолчанию в разделе тем. Затем сообщите, если проблема не устранена colors.xml файл.


Перейдите по этой ссылке, чтобы узнать о проблеме с полупрозрачной строкой состояния Kotlin.
https://github.com/fython/MaterialStatusBarCompat

Другие вопросы по тегам