2011-12-09 202 views
3

findViewById在ImageView控件上为我返回null。 logcat中没有错误,没有任何内容表明发生了什么。 id的匹配和其他图像视图正确设置。 Java和xml通过xml中的类标记进行链接,指向java中定义的类,该类是RelativeLayout的后代。为什么findViewById(...)返回null?

我试着改变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" /> 

感谢

+2

从我这边来的愚蠢的问题,但你有没有尝试重新创建R.java文件(从Eclipse中删除它,它将被重新创建)或使用不同的名称为按钮?当我们在身份证中使用身份证号时,我曾经遇到过同样的问题。 –

+0

不是一个愚蠢的问题,但是我有。我做了一个清理,它删除R.java文件并重新创建所有生成的文件。我也尝试更改名称。起初它只是更多图标。 – FuegoFingers

+1

嗯。现在这是一个奇怪的。我试图重新创建你的布局(除了布局是RelativeLayout的后代,但这不应该是一个问题),它对我来说工作得很好。 我真的不知道这个问题可能会发生什么。总是试图擦除/ bin文件夹并重建项目。这为我解决了以前几个无法解释的问题。 –

回答

6

我也有类似的问题,我的问题是,findviewbyid只有找到孩子的意见。如果视图是兄弟姐妹,则必须从父级调用它。该活动应该能够找到它。

+0

我真的想过这个,所以我研究了它,它应该是好的,只要找到它。其他ocons工作,所以它应该找到他们。 – FuegoFingers

6

使用Android的时候我只是最近有一个类似的问题:知名度=“水涨船高”

<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> 

随着TextViews以上的ImageView,应用程序会崩溃在下面一行。

的Java文件:

setContentView(R.layout.display_image); 

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

如果我移动TextViews下面的ImageView,应用程序将运行但TextViews是由ImageView的覆盖。

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

textViewText.setVisibility(TextView.GONE); 
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。