【问题标题】:Action bar drawer toggle seizes to work with API 23 (appcompat_v7)操作栏抽屉切换抓住 API 23 (appcompat_v7)
【发布时间】:2015-09-20 00:25:15
【问题描述】:

我最近在我的项目中包含了 appcompat v7 库。为了摆脱一堆错误,我更新了我的大部分 SDK 文件,并将我的目标 SDK 版本从 21 更改为 23。问题是,我现在设计导航抽屉切换(汉堡符号/箭头符号)的旧代码不起作用并通过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 设置 Drawer Toggle Arrow 样式的任何想法?

【问题讨论】:

  • 您是否将 support-v4 升级到与 AppCompat-v7 相同的版本?
  • @BladeCoder 我在导入 AppCompat-v7 库之前通过 SDK 更新了 Android 支持库,尽管我仍然必须将 project.properties 目标从 20-23 更改。我还需要单独更新 v4 库吗?我该怎么做?
  • 如果您在项目中直接包含了 support-v4 jar,则需要将其删除。 AppCompat-v7 库项目提供的版本应该没问题。不过如果你使用 Android Studio 会更容易。
  • 崩溃日志表明 support-v4 类中缺少一些必需的方法,这表明您使用的是过时版本的 support-v4 和最新版本的 AppCompat-v7。在 support-v4 版本 23 中添加了 DrawableCompat.getLayoutDirection()。
  • @BladeCoder 嗯...实际上我的项目中也包含了 android_support_v13,它还包含一个 v4 库。所以可能就是这样。我想下载最新版本的 v13 可能会奏效。

标签: android android-navigation android-6.0-marshmallow navigation-drawer


【解决方案1】:

您可以使用 API 23 上的 android 设计支持库并修改导航栏。由于它只是一个 XML 标记,因此易于使用且制作时间较短。而且这个库是向后兼容的。

将此添加到您的 gradle 中:

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>

【讨论】:

  • 如何在 Eclipse 上做到这一点?
  • 您当然可以将您的 eclipse 项目迁移到 android studio 并轻松添加这些更改。如果您不想使用 Android Studio(不确定原因),那么可以使用 Eclipse 的 gradle 插件。 marketplace.eclipse.org/content/gradle-integration-eclipse-0但我还是建议迁移到android studio
猜你喜欢
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多