Java Android:使用findViewById(ID)时的静态引用/非静态方法
让我首先承认我来自Erlang背景,对Android和Java编程是新手。。。老实说,面向对象让我头疼。:) 我遇到了一些棘手的老问题:“不能对非静态方法进行静态引用”。 基本上,我正在编写一个从服务器接收XML的应用程序,并使用它创建一个表单供用户填写。 我成功地解析了XML并创建(和显示)表单。我使用一个(非常)简单的算法为每个EditText字段分配它自己的ID,我可以稍后重新创建这个算法 我正忙着使用submit按钮,该按钮使用用户输入的详细信息向我们的服务器返回HTTP帖子。 当我试图检索用户在表单中输入的值时,问题就出现了。 我试图做的是循环我的ID,使用EditText.findViewById(ID)打开每个EditText实例,并使用getText()检索其文本。 但是,当我这样做时,我收到错误“无法对非静态方法进行静态引用” 现在我已经读了一些书,我的理解是,这是因为我试图以静态的方式访问一个非静态的方法,为了使它成为静态的,我需要调用一个实例的方法,而不是一般的类。。。问题是我调用它是为了得到那个特定的实例,我不知道我应该做什么不同 我非常感谢任何人对我的帮助、建议或进一步阅读 干杯, 贝文 p、 以下是我的代码的相关部分Java Android:使用findViewById(ID)时的静态引用/非静态方法,java,android,findviewbyid,static,Java,Android,Findviewbyid,Static,让我首先承认我来自Erlang背景,对Android和Java编程是新手。。。老实说,面向对象让我头疼。:) 我遇到了一些棘手的老问题:“不能对非静态方法进行静态引用”。 基本上,我正在编写一个从服务器接收XML的应用程序,并使用它创建一个表单供用户填写。 我成功地解析了XML并创建(和显示)表单。我使用一个(非常)简单的算法为每个EditText字段分配它自己的ID,我可以稍后重新创建这个算法 我正忙着使用submit按钮,该按钮使用用户输入的详细信息向我们的服务器返回HTTP帖子。 当我试图
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”的用户。有没有办法做到这一点?