Как реализовать windowdrawsystembackgrounds и statusBarColor в старых API, т.Е. v19?

#android #xml

#Android #xml

Вопрос:

Моя основная деятельность расширяет AppCompatActivity, и я использую панель инструментов поддержки:

 <android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@ id/toolbar"
android:layout_height="?attr/actionBarSize"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize"
android:background="?attr/colorPrimaryDark"
android:elevation="4dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
  

Я хочу раскрасить панель инструментов, используя атрибуты windowsDrawSystemBarBackground и statusBarColor, которые отлично работают в > = v21:

Базовая тема приложения

Но весь ад вырывается при попытке запуска на v19, а именно:

 java.lang.RuntimeException: Unable to start activity ComponentInfo{ca.toadlybroodledev.sublist/ca.toadlybroodledev.sublist.ActivityMain}: java.lang.NullPointerException: println needs a message
  

Кажется, что все ошибки журнала передаются с нулевыми сообщениями? Действительно озадачен этим.

Вот мой основной макет activity, который также имеет расширенное DrawerLayout в качестве корневого:

 <ca.toadlybroodledev.sublist.DrawerCustomLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@ id/drawer_layout"
android:fitsSystemWindows="true"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- This LinearLayout represents the contents of the screen  -->
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <!-- The ActionBar displayed at the top when drawer is shown -->
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

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

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

    <!-- The main content view where fragments are loaded -->
    <FrameLayout
        android:id="@ id/placeholder_for_fragments"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

<!-- The navigation drawer that comes from the left -->
<!-- Note that `android:layout_gravity` needs to be set to 'start' -->
<android.support.design.widget.NavigationView
    android:id="@ id/nvView"
    android:layout_width="200dp"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    android:background="@color/colorPrimaryDark"
    app:itemIconTint="@drawable/drawer_item_color"
    app:itemTextColor="@drawable/drawer_item_color"
    app:headerLayout="@layout/nav_header"
    app:menu="@menu/drawer_menu" />

</ca.toadlybroodledev.sublist.DrawerCustomLayout>
  

Я попытался создать отдельный ресурс стиля (v21), который работает для API >= 21, но не решает основную проблему обратной совместимости. Я также попытался удалить «android: theme =»@style / ThemeOverlay.AppCompat.Dark.Панель действий» на панели инструментов, никакой разницы.

Любая помощь была бы с благодарностью принята, правильная реализация версионных стилей и тем Andoid по какой-то причине всегда ускользала от меня…

[Редактировать 1] Если кому-то интересно, я, наконец, смог выполнить сборку для v19 без уменьшения, добавив это в файл сборки:

 dexOptions { javaMaxHeapSize "2g" }
  

и вот трассировка стека, которую я получаю сейчас:

 E/AndroidRuntime: FATAL EXCEPTION: main
              java.lang.RuntimeException: Unable to start activity ComponentInfo{...ActMain}: java.lang.NullPointerException: println needs a message
                  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
                  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
                  at android.app.ActivityThread.access$800(ActivityThread.java:135)
                  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
                  at android.os.Handler.dispatchMessage(Handler.java:102)
                  at android.os.Looper.loop(Looper.java:136)
                  at android.app.ActivityThread.main(ActivityThread.java:5017)
                  at java.lang.reflect.Method.invokeNative(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:515)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
                  at dalvik.system.NativeStart.main(Native Method)
               Caused by: java.lang.NullPointerException: println needs a message
                  at android.util.Log.println_native(Native Method)
                  at android.util.Log.d(Log.java:139)
                  at ca.toadlybroodledev.sublist.ActMain.updateColors(ActMain.java:404)
                  at ca.toadlybroodledev.sublist.DrawerCustomLayout.onFinishInflate(DrawerCustomLayout.java:50)
                  at android.view.LayoutInflater.rInflate(LayoutInflater.java:764)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
                  at android.view.LayoutInflater.inflate(LayoutInflater.java:353)
                  at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284)
                  at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:143)
                  at ca.toadlybroodledev.sublist.ActMain.onCreate(ActMain.java:77)
  

Комментарии:

1. Какая строка вызывает NPE? Пожалуйста, опубликуйте всю трассировку стека.

2. Ха-ха, я надеялся избежать этого, поскольку мои классы кажутся запутанными из-за необходимости минимизации для успешной сборки для v19… но это еще одна проблема в целом.

3. У меня есть следующее правило в моем файле debug proguard, но по какой-то причине оно все еще запутывает мои классы? -сохранить класс ca.toadlybroodledev.sublist

4. Хорошо, я наконец смог выполнить сборку для v19 без уменьшения, добавив это в файл сборки: dexOptions { javaMaxHeapSize «2g» }

Ответ №1:

Вы можете изменить цвет строки состояния только в Lollipop, если хотите изменить цвет строки состояния для Api >= 19 вам это нужно в стиле value-v19 проверьте файлы, которые вам нужны для определенных версий (более старых):

 <?xml version="1.0" encoding="utf-8"?>
<resources>

        <style name="AppTheme" parent="MaterialDrawerTheme.Light">
                <!-- Customize your theme here. -->
                <item name="android:windowNoTitle">true</item>
                <item name="android:windowTranslucentStatus">true</item>
                .....
        </style>
</resources>
  

Комментарии:

1. Извините, если я слишком плотный, но когда я делаю это, я получаю ошибку:

2. Ошибка при получении родительского элемента для элемента: не найден ресурс, соответствующий заданному имени ‘MaterialDrawerTheme. Свет».