【发布时间】:2012-05-26 08:40:51
【问题描述】:
首先让我承认我来自 Erlang 背景,并且是 Android 和 Java 编程的新手……老实说,面向对象让我很头疼。 :)
我遇到了一些棘手的老栗子问题:“无法对非静态方法进行静态引用”。 基本上我正在编写一个应用程序,它从我们的服务器接收 XML 并使用它来创建一个由用户填写的表单。 我已成功解析 XML 并创建(并显示)表单。我使用(非常)简单的算法为每个 EditText 字段分配了自己的 ID,以后可以重新创建。
我正忙于提交按钮,该按钮使用用户输入的详细信息将 HTTP 发回我们的服务器。 当我尝试检索用户在表单中输入的值时,我的问题就出现了。 我正在尝试做的是遍历我的 ID,使用 EditText.findViewById(ID) 打开每个 EditText 实例并使用 getText() 检索其文本。 但是,当我这样做时,我收到错误“无法对非静态方法进行静态引用”。
现在我已经阅读了一些内容,我的理解是,这是因为我正在尝试以静态方式访问非静态方法,为了使其成为静态方法,我需要调用实例的方法而不是一般的类...问题是我按顺序调用它以获取该特定实例,但我无法弄清楚我应该做些什么不同。
我非常感谢任何人对我的任何帮助、建议或进一步阅读。
干杯, 贝文
附言这是我的代码的相关部分
private static LinearLayout renderForm(...)
{
//Build Fields
...
//Build Buttons
...
Button BT = new Button(App);
BT.setOnClickListener(new View.OnClickListener() {
public void onClick(View v)
{
...
for(int j = 0; j < FFListLength; j++)
{
EditText BinField = (EditText) EditText.findViewById(20000+j);
...
}
...
}
}
}
更新: 阅读 JB Nizet 的回答后,我意识到我做错了什么。 我改变了这一行: EditText BinField = (EditText) EditText.findViewById(20000+j); 到: EditText binField = (EditText) lContent.findViewById(20000+j);
其中 lContent 是我的视图的内容。
感谢您的帮助。 贝文
【问题讨论】:
-
请尊重 Java 命名约定:变量以小写字母开头。如果您遵守这些约定,您将能够更轻松地区分对静态方法的调用和对实例方法的调用。
-
感谢 JB Nizet 的建议,我会尽量坚持下去。在 Erlang 中恰恰相反,变量以大写字母开头,而函数以小写字母开头……这是我习惯的另一个变化。
-
变量和函数在 java 中以小写字母开头。类和枚举以大写字母开头。另外,请注意,不推荐您的“findViewById”调用,因为它的循环很大。考虑保存您知道的项目的数组/列表,以及您希望处理的视图。如果你愿意,你可以让 id 的名称为“edittext1”、“edittext2”、...,并使用 getidentifier 获取它们的 id,然后循环遍历它们,当你没有得到它们时停止身份证。
标签: java android findviewbyid static