【问题标题】:Android: static reference / non-static method when using findViewById(ID)Android:使用 findViewById(ID) 时的静态引用/非静态方法
【发布时间】: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


【解决方案1】:

我不打算评论 Android 的具体问题。仅在您遇到的一般编译错误上。举个例子:

public class User {
    private String name;

    public User(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }
}

为了能够调用 getName() 方法,您需要一个 User 实例:

User john = new User("John");
String johnsName = john.getName();

您正在做的是在没有任何用户实例的情况下调用 getName() 方法:

String someName = User.getName();

这没有意义。您没有任何用户。只有用户类。

正如我在评论中指出的那样;变量应以小写字母开头。类以大写字母开头。如果你尊重这个约定,一切都会更清楚:

john.getName(); // instance method call on object john, of type User.
User.getName(); // static method call on User class.

【讨论】:

  • 谢谢,这确实有道理。现在,我的问题是我需要使用名称 ==“约翰”打开用户。有没有办法做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多