Переключатель панели действий перестает работать с API 23 (appcompat_v7)

Недавно я включил в свой проект библиотеку appcompat v7. Пытаясь избавиться от множества ошибок, я обновил большинство своих файлов SDK и изменил целевую версию SDK на 23 с 21. Проблема в том, что мой старый код для разработки переключателя навигационного ящика (знак гамбургера/знак стрелки) теперь не работает и выдает и показывает ошибки в файлах через eclipse.

Вот код:

 <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
    <item name="spinBars">false</item>
    <item name="barSize">16sp</item>
    <item name="gapBetweenBars">4sp</item>
    <item name="color">@android:color/white</item>
</style>

Вот его реализация в моей пользовательской теме:

<item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 

Ошибка Eclipse гласит: не найден ресурс, соответствующий данному имени: attr «barSize».

Когда я это комментирую, приложение запускается, но вылетает с журналом ошибок:

09-20 01:09:39.852: E/AndroidRuntime(1662): FATAL EXCEPTION: main
09-20 01:09:39.852: E/AndroidRuntime(1662): Process: com.site.app, PID: 1662
09-20 01:09:39.852: E/AndroidRuntime(1662): java.lang.NoSuchMethodError: No static method getLayoutDirection(Landroid/graphics/drawable/Drawable;)I in class Landroid/support/v4/graphics/drawable/DrawableCompat; or its super classes (declaration of 'android.support.v4.graphics.drawable.DrawableCompat' appears in /data/app/com.site.app-2/base.apk)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.support.v7.graphics.drawable.DrawerArrowDrawable.draw(DrawerArrowDrawable.java:337)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.widget.ImageView.onDraw(ImageView.java:1209)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.draw(View.java:15210)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.updateDisplayListIfDirty(View.java:14144)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.getDisplayList(View.java:14167)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.draw(View.java:14934)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.ViewGroup.drawChild(ViewGroup.java:3410)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3204)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.updateDisplayListIfDirty(View.java:14139)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.getDisplayList(View.java:14167)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.draw(View.java:14934)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.ViewGroup.drawChild(ViewGroup.java:3410)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.ViewGroup.dispatchDraw(ViewGroup.java:3204)
09-20 01:09:39.852: E/AndroidRuntime(1662):     at android.view.View.draw(View.java:15213)

...

Этот же код работал, когда я компилировал с API 21. Есть идеи, как стилизовать стрелку переключения ящика с помощью API 23?


person Visionwriter    schedule 20.09.2015    source источник
comment
Вы обновили support-v4 до той же версии, что и AppCompat-v7?   -  person BladeCoder    schedule 25.09.2015
comment
@BladeCoder Я обновил библиотеку поддержки Android через SDK перед импортом библиотеки AppCompat-v7, хотя мне все же пришлось изменить цель project.properties с 20 на 23. Нужно ли мне по-прежнему обновлять библиотеку v4 по отдельности и как мне это сделать?   -  person Visionwriter    schedule 25.09.2015
comment
Если вы включили jar support-v4 непосредственно в свой проект, вам необходимо удалить его. Версия, поставляемая с проектом библиотеки AppCompat-v7, должна быть в порядке. Однако было бы проще, если бы вы использовали Android Studio.   -  person BladeCoder    schedule 25.09.2015
comment
Журнал сбоев предполагает, что в классах support-v4 отсутствуют некоторые обязательные методы, что указывает на то, что, возможно, вы используете устаревшую версию support-v4 с последней версией AppCompat-v7. DrawableCompat.getLayoutDirection() был добавлен в support-v4 версии 23.   -  person BladeCoder    schedule 25.09.2015
comment
@BladeCoder Хм ... На самом деле у меня также есть android_support_v13, включенный в мой проект, который также содержит библиотеку v4. Так что может быть это. Я думаю, что загрузка последней версии v13 может помочь.   -  person Visionwriter    schedule 25.09.2015
comment
Support-v13 включает утилиты для нативных фрагментов. AppCompat-v7 использует фрагменты поддержки, предоставляемые support-v4. Я думаю, вам следует полностью удалить support-v13, если вы используете AppCompat.   -  person BladeCoder    schedule 25.09.2015
comment
Большой! @БлейдКодер. Это наконец сработало. Проект по умолчанию использовал библиотеку v4 в библиотеке v13. Удаление этого решило проблему. Спасибо!   -  person Visionwriter    schedule 25.09.2015
comment
Кстати, вы должны поместить краткое изложение этого в качестве ответа, чтобы я мог выбрать его как правильный ответ, и другие тоже могут получить пользу. @BladeCoder   -  person Visionwriter    schedule 25.09.2015


Ответы (1)


Вы можете использовать библиотеки поддержки дизайна Android в API 23 и изменить панель навигации. Его легко использовать, и на его создание уходит меньше времени, поскольку это всего лишь XML-тег. И эта библиотека обратно совместима.

Добавьте это в свой град:

compile 'com.android.support:design:22.2.1'

Стоит изменить код. Поскольку поддержка дизайна Android уменьшит большую неуклюжесть, необходимую для разработки панели навигации раньше. Небольшой фрагмент кода даст вам панель навигации.

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true">

<!-- your content layout -->

<android.support.design.widget.NavigationView
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:headerLayout="@layout/drawer_header"
        app:menu="@menu/drawer"/>
</android.support.v4.widget.DrawerLayout>
person Vishal Sharma    schedule 20.09.2015
comment
Как мне это сделать на затмении? - person Visionwriter; 20.09.2015
comment
Конечно, вы можете перенести свой проект eclipse в студию Android и легко добавить эти изменения. Если вы не хотите использовать студию Android (не уверены в причине), то для eclipse доступны плагины gradle. marketplace.eclipse.org/content/gradle-integration-eclipse-0 Но я все же предложу перейти на андроид студию - person Vishal Sharma; 20.09.2015