新手对Android的findViewById()函数感到困惑?

3

在android开发方面,我是一个新手,请您多多包涵。目前我正在使用Windows 8 / Eclipse。

我的问题是,findViewById函数似乎出了点问题,虽然我很可能使用方法不正确。

应用程序之前运行得非常好,但是我给页面上添加了一些新的TextView后,它似乎完全混乱了。

findViewById函数现在要么完全找错控件,要么根本找不到任何东西(并返回null)。 我已经检查过我的activity_main.xml文件,并且id仍然是正确的。

有人能帮忙吗?

这是我使用的典型例子:

public void toggleButtonNetwork_Click(View v) {
  ToggleButton tb = (ToggleButton) this.findViewById(R.id.toggleButtonNetwork);//did work, now does not work!
}

我唯一能提供的信息是,当我的R.java文件正常工作时,它的样子是这样的:
...
    public static final class id {
      public static final int menu_settings=0x7f070004;
      public static final int textViewGPS=0x7f070003;
      public static final int textViewNetwork=0x7f070001;
      public static final int toggleButtonGPS=0x7f070002;
      public static final int toggleButtonNetwork=0x7f070000;
    }
...

现在看起来是这样的(损坏):
public static final class id {
    public static final int menu_settings=0x7f070006;
    public static final int textView1=0x7f070004;
    public static final int textView2=0x7f070005;
    public static final int textViewGPS=0x7f070002;
    public static final int textViewNetwork=0x7f070003;
    public static final int toggleButtonGPS=0x7f070000;
    public static final int toggleButtonNetwork=0x7f070001;
}

4
你清理了你的项目吗? - A--C
请发布您正在填充的布局XML。 @+id/toggleButtonNetwork 是否存在? - dnkoutso
R.java是自动生成的。除非好奇,否则您永远不需要查看其中的内容。Android会处理所有底层工作。 - Simon
@A--C 是的,那个方法可行!非常感谢。不过我有点困惑,每次我往“activity_view.xml”中添加新控件时,都需要这样做吗? - maxp
3个回答

5

这是一个非常常见的问题。请尝试在您的项目中调用 Project/Clean...。有时会出现自动生成 R 类的错误,这样可以强制重建它们。


3

一切都很好。

每次只需进入项目 -> 清理,然后运行即可。就是这样简单。


1
这不是对你问题的回答。我怀疑A--Cs的评论是正确的。
但是,没有什么需要困惑的。findViewById非常简单。
当您编译应用程序时,编译器会生成R.java并为布局XML中每个视图添加一行(以及字符串、可绘制、颜色等 - 任何是“资源”的内容),并为其分配一个唯一的ID。
public static final int toggleButtonNetwork=0x7f070001;

ID会随着资源的更改而更改,但这并不重要。当您使用findViewById时,您给它一个“友好名称”,在这种情况下是R.id.toggleButtonNetwork,它被编译为0x7f070001,因为public static final int toggleButtonNetwork是一个静态常量。
当您从XML中填充视图(通常使用setContentView)时,对象的视图层次结构会被构建。每个对象的ID都是在R.java中找到的ID。 findViewById返回对该对象的引用,类型为View,然后您将其转换为它是什么类型的View,这就是为什么您使用
= (Button)findViewById(R.id.toggleButtonNetwork);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接