【问题标题】:Why does findViewById(...) return null?为什么 findViewById(...) 返回 null?
【发布时间】:2011-12-09 22:46:08
【问题描述】:

findViewById 在 ImageView 小部件上为我返回 null。 logcat 中没有错误,也没有任何内容表明正在发生的事情。 id 的匹配和其他图像视图正在正确设置。 Java和xml通过xml中的class标签链接,指向java中定义的类,该类是RelativeLayout的后代。

我尝试更改 R.id.more_icon1 的名称,但没有成功。尝试清洁,但没有奏效。使用调试器查看它确实只是在过去以及何时返回 mMoreIcon == null。

奇怪的是,另一个 ImageView 的工作还不错。

有人看过这个或者有什么想法吗?

Java 代码:类是 RelativeLayout 的后代

@Override
protected void onFinishInflate() {
    super.onFinishInflate();
    mText1 = (TextView) findViewById(R.id.text1);
    mText2 = (TextView) findViewById(R.id.text2);
    mIcon1 = (ImageView) findViewById(R.id.icon1);
    mIcon2 = (ImageView) findViewById(R.id.icon2);
    // mMoreIcon is the one that gets set as null. mIcon1 and mIcon2 work just fine.
    mMoreIcon = (ImageView) findViewById(R.id.more_icon1);

}

XML 代码:

<ImageView android:id="@+id/icon1"
    style="@style/SuggestionIcon1"
    android:scaleType="centerInside"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
/>

<!--     This is the icon that is being returned as null -->
<ImageView android:id="@+id/more_icon1"
    style="@style/MoreIcon2"
    android:scaleType="centerInside"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:visibility="gone" />

<ImageView android:id="@+id/icon2"
    style="@style/SuggestionIcon2"
    android:scaleType="centerInside"
    android:layout_toLeftOf="@id/more_icon1"
    android:layout_alignParentTop="true"
    android:layout_alignParentBottom="true"
    android:visibility="gone" />

谢谢

【问题讨论】:

  • 我的问题很愚蠢,但是您是否尝试过重新创建 R.java 文件(从 Eclipse 中删除它,它将重新创建)或为按钮使用不同的名称?我曾经在使用带有数字的 id 时遇到过同样的问题。
  • 不是一个愚蠢的问题,但我有。我对其进行了 make clean ,它删除了 R.java 文件并重新创建了所有生成的文件。我也试过改名字。起初它只是 more_icon。
  • 嗯。现在这是一个奇怪的问题。我尝试重新创建您的布局(除了布局是 RelativeLayout 的后代,但这应该不是问题),它对我来说很好。我真的不知道问题可能出在哪里。总是试图擦除 /bin 文件夹并重建项目。这解决了我之前的几个无法解释的问题。
  • 对我来说,这是一个错误的参考问题,所以我实际上并没有在正确的父级下寻找视图。复制/粘贴代码的工件。

标签: android android-layout android-widget


【解决方案1】:

我最近在使用 android:visibility="gone" 时遇到了类似的问题

<RelativeLayout 
    android:id="@+id/relativeLayoutMessage"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@+id/linearLayoutMenu" android:layout_above="@+id/layoutButtons">
        <ImageView android:id="@+id/imageView" 
            android:layout_width="fill_parent" 
            android:contentDescription="@string/image_attachment" 
            android:src="@drawable/icon" 
            android:scaleType="fitCenter" 
            android:layout_height="fill_parent"
            android:layout_alignParentTop="true" /> 
        <TextView
            android:id="@+id/textViewTitle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center" 
            android:textSize="20dip"
            android:layout_alignParentTop="true"/>
        <TextView
            android:id="@+id/textViewText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:visibility="gone" 
            android:gravity="center"
            android:layout_below="@+id/textViewTitle"/> 
</RelativeLayout>   

使用 TextView 上方的 ImageView,应用程序将在以下行崩溃。

Java 文件:

    setContentView(R.layout.display_image);

    imageView = (ImageView) findViewById(R.id.imageView);

如果我将 ImageView 移到 TextViews 下面,应用程序会运行,但 TextViews 会被 ImageView 覆盖。

一旦我删除了 android:visibility="gone",findViewById 就会正确解析。我所要做的就是事后在代码中设置可见性。

textViewText.setVisibility(TextView.GONE);

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我的问题是 findviewbyid 只能找到子视图。如果视图是同级视图,则必须从父级调用它。该活动应该能够找到它。

    【讨论】:

    • 我确实想过这个,所以我研究了一下,只要找到它就应该很好。其他 ocon 工作,所以它应该找到它们。
    【解决方案3】:

    我也有这个问题。这是我的代码:

    RelativeLayout ml = (RelativeLayout) findViewById(R.id.layout);
    public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_the_next);
    

    改成这个之后就可以了:

    RelativeLayout ml;
    public void onCreate(Bundle savedInstanceState) {
    setContentView(R.layout.activity_the_next);
    ml = (RelativeLayout) findViewById(R.id.layout);
    

    似乎如果你在 setContentView() 之前实例化你的布局,它会返回 null。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-27
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-03-16
      • 1970-01-01
      相关资源
      最近更新 更多