【问题标题】:Strange NullpointerException when trying to retrieve LinearLayout尝试检索 LinearLayout 时出现奇怪的 NullpointerException
【发布时间】:2011-11-20 19:39:07
【问题描述】:

这有点像在黑暗中拍摄,但也许我犯了一个明显的错误; 我在 main.xml 中定义了一个 LinearLayout,其 ID 为“@+id/imageListContainer”。我的 main.xml 中没有其他内容,LinearLayout 是完全简单的(因为 eclipse 从 GUI 编辑器为您插入它)。

    <LinearLayout
        android:id="@+id/imageListContainer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical">
    </LinearLayout>

然后我想使用以下代码动态填充 LinearLayout:

LinearLayout imageContainer = (LinearLayout)findViewById(R.id.imageListContainer);

来自应用程序 onCreate() 回调函数。

这曾经工作得很好。然而,当我开始在这里和那里添加代码片段(主要是在其他活动中)​​时,它在某些时候停止工作,现在我一直通过 findViewById() 返回一个空指针。我尝试重新生成 R.java,重命名 LinearLayout(以确保我可以控制访问它的位置;但它只能从一个地方访问)。我尝试将代码放入 onStart() 中,认为 onCreate 可能运行得太早,创建了竞争条件,但也没有运气。我还确保 LinearLayout 确实被称为“imageListContainer”,它就是(否则生成的 R.java 将是错误的并且 javac 无论如何都会抱怨)并且任何地方都没有重复的“imageListContainer”对象。

我不知道这可能是什么原因,所以我很感激任何建议或猜测。

这是堆栈跟踪:

E/AndroidRuntime(  327): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime(  327): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.company.PictureListView/com.company.PictureListView.PictureListView.PictureListActivity}: java.lang.NullPointerException
E/AndroidRuntime(  327):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496)
E/AndroidRuntime(  327):        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512)
E/AndroidRuntime(  327):        at android.app.ActivityThread.access$2200(ActivityThread.java:119)
E/AndroidRuntime(  327):        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863)
E/AndroidRuntime(  327):        at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(  327):        at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime(  327):        at android.app.ActivityThread.main(ActivityThread.java:4363)
E/AndroidRuntime(  327):        at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(  327):        at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime(  327):        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
E/AndroidRuntime(  327):        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
E/AndroidRuntime(  327):        at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(  327): Caused by: java.lang.NullPointerException
E/AndroidRuntime(  327):        at com.company.PictureListView.PictureListActivity.updateMainActivityScreen(PictureListActivity.java:50)
E/AndroidRuntime(  327):        at com.company.PictureListPictureListActivity.onCreate(PictureListActivity.java:38)
E/AndroidRuntime(  327):        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
E/AndroidRuntime(  327):        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459)

PS:我忘了说,我也调用了 setContentView(R.layout.main),所以这也不是问题。

PSS:我尝试在 GUI 中添加一个按钮,然后在该按钮的回调中调用包含 findViewById() 的代码,这很有效!这让我回到了可能存在一些竞争条件的想法。

【问题讨论】:

  • 你调用 setContentView(R.layout.main) 了吗?如果不是,您必须使用 LayoutInflater 来膨胀 xml 布局
  • 你在活动中调用了“setContentView”吗?
  • 这就是你在 main.xml 中得到的全部内容吗?如果是这种情况,您可能会在第一行中缺少 &lt;?xml version="1.0" encoding="utf-8"?&gt; 和 LinearLayout 中的 xmlns:android="http://schemas.android.com/apk/res/android"。如果没有,请告诉我们您的onCreateupdateMainActivityScreen
  • 你试过清理项目+刷新项目+构建项目+再次运行吗?
  • 清理项目 = 选择你的项目,然后项目菜单 -> 清理...

标签: android android-layout android-widget android-linearlayout


【解决方案1】:

这是问题的cmets的答案:

您的活动中有内部类吗?我读了例外 仔细追踪:首先 com.company.PictureListPictureListActivity.onCreate 然后 com.company.PictureListView.PictureListActivity.updateMainActivityScreen --> 在我看来 findViewById 在不同的对象中被调用。尝试将 findViewByID 移动到 onCreate 并检查它是否在那里工作。

似乎在某个开发阶段有一个内部类,后来被删除了。不知何故,项目文件未适当更新。清理项目、刷新文件系统内容并重新构建项目应该可以让一切恢复正常。

【讨论】:

  • 澄清一下,在我告诉 eclipse 按照您的建议清理项目后,问题就消失了。我不确定到底是什么问题,但它可能是嵌套类中的一个 .class 文件。我稍后会更仔细地调查这个问题,现在我很高兴回到正轨。感谢您抽出宝贵的时间,并获得我所有的支持。
  • 好的,很好:) 我注意到,每当资源被修改时,很有可能出现问题。我总是在修改资源后清理 + 刷新 + 构建项目。自从采用这种时尚以来从未遇到过问题。
猜你喜欢
  • 2016-09-16
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多