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

Java Android:使用findViewById(ID)时的静态引用/非静态方法,java,android,findviewbyid,static,Java,Android,Findviewbyid,Static,让我首先承认我来自Erlang背景,对Android和Java编程是新手。。。老实说,面向对象让我头疼。:) 我遇到了一些棘手的老问题:“不能对非静态方法进行静态引用”。 基本上,我正在编写一个从服务器接收XML的应用程序,并使用它创建一个表单供用户填写。 我成功地解析了XML并创建(和显示)表单。我使用一个(非常)简单的算法为每个EditText字段分配它自己的ID,我可以稍后重新创建这个算法 我正忙着使用submit按钮,该按钮使用用户输入的详细信息向我们的服务器返回HTTP帖子。 当我试图

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

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

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

现在我已经读了一些书,我的理解是,这是因为我试图以静态的方式访问一个非静态的方法,为了使它成为静态的,我需要调用一个实例的方法,而不是一般的类。。。问题是我调用它是为了得到那个特定的实例,我不知道我应该做什么不同

我非常感谢任何人对我的帮助、建议或进一步阅读

干杯, 贝文

p、 以下是我的代码的相关部分

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);
                ...
            }
            ...
        }
    }
}
专用静态线性布局渲染格式(…)
{
//构建字段
...
//构建按钮
...
按钮BT=新按钮(应用程序);
BT.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v)
{
...
对于(int j=0;j
更新: 在读了他的答案后,我意识到我做错了什么。 我改变了路线: EditText BinField=(EditText)EditText.findViewById(20000+j); 致: EditText binField=(EditText)lContent.findViewById(20000+j)

其中lContent是我观点的内容

谢谢你的帮助。
Bevan

我不会对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();
String someName = User.getName();
您所做的是调用getName()方法,而不调用任何User实例:

User john = new User("John");
String johnsName = john.getName();
String someName = User.getName();
这没有意义。你没有任何用户。只有用户类

正如我在评论中所指出的,变量应该以小写字母开头。类以大写字母开头。如果您遵守此约定,一切都会更清楚:

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

请遵守Java命名约定:变量以小写字母开头。如果遵守这些约定,您将能够更容易地区分对静态方法的调用和对实例方法的调用。感谢JB Nizet的建议,我将尝试坚持这一点。在Erlang中,变量以大写字母开头,而函数以大写字母开头ons以小写字母开始…这是我习惯的另一个变化。在java中,变量和函数以小写字母开始。类和枚举以大写字母开始。另外,请注意您的“findViewById”因为它的大循环,所以不推荐调用。考虑保存一个您知道的视图的数组/列表项。如果您愿意,可以使ID具有“EdtTeX1”、“EdtTeXT2”的名称。,…,然后使用getidentifier获取他们的id,然后在循环中对其进行检查,当您没有获取他们的id时停止。谢谢,这是有意义的。现在,我的问题是,我需要打开名为==“John”的用户。有没有办法做到这一点?