导航抽屉 - 抽屉布局无法实例化

时间:2014-10-23 14:56:00

标签: java android navigation-drawer instantiation

我正在尝试在我的应用程序中实现导航抽屉,但我遇到了严重问题。现在我的问题是我想将我的MainContent放在Drawer Layout中,如下所示:

<android.support.v4.widget.DrawerLayout
    android:id = "@+id/drawer_layout"
    xmlns:android = "http://schemas.android.com/apk/res/android"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    >

    <FrameLayout
      [...]
    </FrameLayout>
</android.support.v4.widget.DrawerLayout>

但我收到此错误代码

  

无法实例化以下类:    - android.support.v4.widget.DrawerLayout(Open Class,Show Exception)

这些是例外情况:

java.lang.ClassNotFoundException: android.support.v4.widget.DrawerLayoutImpl
    at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:148)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:642)
    at com.intellij.util.lang.UrlClassLoader._defineClass(UrlClassLoader.java:195)
    at com.intellij.util.lang.UrlClassLoader.defineClass(UrlClassLoader.java:191)
    at com.intellij.util.lang.UrlClassLoader.findClass(UrlClassLoader.java:152)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at com.android.tools.idea.rendering.RenderClassLoader.loadClassFromJar(RenderClassLoader.java:78)
    at org.jetbrains.android.uipreview.ProjectClassLoader.loadClassFromModuleOrDependency(ProjectClassLoader.java:108)
    at org.jetbrains.android.uipreview.ProjectClassLoader.load(ProjectClassLoader.java:89)
    at com.android.tools.idea.rendering.RenderClassLoader.findClass(RenderClassLoader.java:56)
    at org.jetbrains.android.uipreview.ProjectClassLoader.findClass(ProjectClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.jetbrains.android.uipreview.ViewLoader.loadClass(ViewLoader.java:173)
    at org.jetbrains.android.uipreview.ViewLoader.loadView(ViewLoader.java:96)
    at com.android.tools.idea.rendering.LayoutlibCallback.loadView(LayoutlibCallback.java:172)
    at android.view.BridgeInflater.loadCustomView(BridgeInflater.java:207)
    at android.view.BridgeInflater.createViewFromTag(BridgeInflater.java:132)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:482)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:385)
    at com.android.layoutlib.bridge.impl.RenderSessionImpl.inflate(RenderSessionImpl.java:401)
    at com.android.layoutlib.bridge.Bridge.createSession(Bridge.java:329)
    at com.android.ide.common.rendering.LayoutLibrary.createSession(LayoutLibrary.java:332)
    at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:575)
    at com.android.tools.idea.rendering.RenderService$3.compute(RenderService.java:564)
    at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:932)
    at com.android.tools.idea.rendering.RenderService.createRenderSession(RenderService.java:564)
    at com.android.tools.idea.rendering.RenderService.render(RenderService.java:691)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.doRender(AndroidLayoutPreviewToolWindowManager.java:604)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager.access$1900(AndroidLayoutPreviewToolWindowManager.java:80)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7$1.run(AndroidLayoutPreviewToolWindowManager.java:546)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl$2.run(ProgressManagerImpl.java:178)
    at com.intellij.openapi.progress.ProgressManager.executeProcessUnderProgress(ProgressManager.java:209)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:212)
    at com.intellij.openapi.progress.impl.ProgressManagerImpl.runProcess(ProgressManagerImpl.java:171)
    at org.jetbrains.android.uipreview.AndroidLayoutPreviewToolWindowManager$7.run(AndroidLayoutPreviewToolWindowManager.java:541)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:320)
    at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:310)
    at com.intellij.util.ui.update.MergingUpdateQueue$2.run(MergingUpdateQueue.java:254)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:269)
    at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:227)
    at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:217)
    at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
    at com.intellij.util.Alarm$Request$1.run(Alarm.java:327)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我遵循本指南http://developer.android.com/training/implementing-navigation/nav-drawer.html但到目前为止它根本不起作用。也许有人有一个更好的教程,如何使用Android 5.0正确实现导航抽屉??

提前感谢您的帮助。

真诚的约翰

4 个答案:

答案 0 :(得分:5)

遇到同样的问题,首先要注意Christer Nordvik的评论:

  

认为这是最新工具版本中的错误:   https://code.google.com/p/android/issues/detail?id=78090

     

我们在设计师中也有同样的东西,但在运行时它很好。工作   在API级别21发布SDK之前没有问题。

我认为你有4种选择:


选项1:返回Android 5.0 5.0 使用SDK 20代码并使用您的代码编译

将build.gradle更改为以下内容:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.example.yourapp"
        minSdkVersion 8
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:20.0.0'
}

将以下行更改为与项目对应的行:

        applicationId "com.example.yourapp"
        minSdkVersion 8

您很可能还需要更改&#34; res \ v21 \ styles.xml&#34;从:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Material.Light">
    </style>
</resources>

为:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light">
    </style>
</resources>

由于材料主题在Lollipop / Android 5.0上推出

将您的项目与新的gradle文件同步,等待同步完成,你很高兴,你现在应该看到布局预览

Sync your project with Gradle Files


选项2:以文字更新您的代码

代码将编译并正常工作,只需在文本中更新代码,无需预览。而是进行更改并在模拟器或实际的Android设备上试用它们。


选项3:合并前两个选项

使用选项1,执行您需要对布局执行的操作(只要它不需要SDK 21中的任何特定内容),并在完成时将还原对build.gradle和styles.xml进行更改,以便您可以享受棒棒糖的新眼睛糖果,只需按照选项2的建议在模拟器或设备上进行测试


选项4:等待他们修复错误

就是这样。


远射额外选项:

如果您已经安装了稳定版本的Android Studio,请尝试测试Beta或Canary,他们知道,可能有一个补丁实现了解决其中一个问题(我有一个稳定的版本,所以我没有&#39 ;知道)。或者试试Eclipse

答案 1 :(得分:0)

您提到的错误来自UI编辑器。当无法在编辑器中预览自定义视图时会发生这种情况。这不是问题。如果你运行你的应用程序一切都应该没问题。

答案 2 :(得分:0)

这是一个简单的导航抽屉 - 抽屉布局代码,你可以毫无错误地使用它。

    <android.support.v4.widget.DrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

       <FrameLayout
            android:id="@+id/left_drawer"
            android:layout_width="330dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:choiceMode="multipleChoice"
            android:divider="@android:color/transparent"
            android:dividerHeight="0dp"
            android:background="@drawable/gradient_gray">

          [...]
    </FrameLayout>
</android.support.v4.widget.DrawerLayout>

答案 3 :(得分:0)

认为这是最新工具版本中的错误: https://code.google.com/p/android/issues/detail?id=78090

我们在设计师中也有同样的东西,但在运行时它很好。在API级别21发布之前,没有遇到任何问题。