Android:使用findViewById(ID)时的静态引用/非静态方法

时间:2012-05-26 08:40:52

标签: java android findviewbyid static

让我首先承认我来自Erlang背景并且是Android和Java编程的新手......说实话,面向对象让我很头疼。 :)

我在使用粘稠的旧栗子时遇到了一些问题:“无法对非静态方法进行静态引用”。 基本上我正在编写一个应用程序,它从我们的服务器接收XML并使用它来创建一个由用户填写的表单。 我成功地解析了XML并创建(并显示)表单。我使用(非常)简单的算法为每个EditText字段分配它自己的ID,我可以在以后重新创建。

我正忙于提交按钮,该按钮会使用用户输入的详细信息将HTTP帖子发回我们的服务器。 当我尝试检索用户在表单中输入的值时,我的问题就出现了。 我试图做的是循环我的ID,使用EditText.findViewById(ID)打开每个EditText实例并使用getText()检索其文本。 当我这样做但是我收到错误“无法对非静态方法进行静态引用”。

现在我已经做了一些阅读,我理解它的方式是因为我试图以静态方式访问非静态方法并且为了使其静态我需要调用实例的方法而不是一般的类...问题是我在调用它以获得该特定实例并且我无法弄清楚我应该做的不同。

我真的很感激任何人对我有任何帮助,建议或进一步阅读。

干杯, 贝文

P.S。以下是我的代码的相关部分

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是我视图的内容。

感谢您的帮助。 贝文

1 个答案:

答案 0 :(得分:0)

我不打算评论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()方法而不使用User的任何实例:

String someName = User.getName();

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

如我的评论中所述;变量应以小写字母开头。类以大写字母开头。如果你尊重这个惯例,一切都会更清楚:

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