用Java构建多语言应用程序。从R.string
资源XML文件插入String值时出现错误:
public static final String TTT = (String) getText(R.string.TTT);
这是错误消息:
错误:无法从上下文类型静态引用非静态方法getText(int)
这是怎么引起的,我该如何解决?
getString()
在需要时通过他们提出要求。这样,您的应用程序就可以适应用户更改他们选择的语言的情况。
用Java构建多语言应用程序。从R.string
资源XML文件插入String值时出现错误:
public static final String TTT = (String) getText(R.string.TTT);
这是错误消息:
错误:无法从上下文类型静态引用非静态方法getText(int)
这是怎么引起的,我该如何解决?
getString()
在需要时通过他们提出要求。这样,您的应用程序就可以适应用户更改他们选择的语言的情况。
Answers:
由于getText()
它是非静态的,因此无法从静态方法中调用它。
要了解原因,您必须了解两者之间的区别。
实例(非静态)方法适用于特定类型(类)的对象。这些是使用新的创建的,如下所示:
SomeClass myObject = new SomeClass();
要调用实例方法,请在实例(myObject
)上调用它:
myObject.getText(...)
但是,只能直接在类型上调用静态方法/字段,如下所示:
前一条语句不正确。也可以使用诸如此类的对象引用来引用静态字段, myObject.staticMethod()
但是不建议这样做,因为它并不清楚它们是类变量。
... = SomeClass.final
两者不能一起工作,因为它们在不同的数据空间(实例数据和类数据)上运行
让我尝试解释一下。考虑此类(伪代码):
class Test {
string somedata = "99";
string getText() { return somedata; }
static string TTT = "0";
}
现在,我有以下用例:
Test item1 = new Test();
item1.somedata = "200";
Test item2 = new Test();
Test.TTT = "1";
有什么价值?
好
in item1 TTT = 1 and somedata = 200
in item2 TTT = 1 and somedata = 99
换句话说,TTT
是该类型的所有实例共享的数据。所以说没有道理
class Test {
string somedata = "99";
string getText() { return somedata; }
static string TTT = getText(); // error there is is no somedata at this point
}
所以问题是为什么TTT是静态的,或者为什么getText()不是静态的?
删除static
,它应该会越过此错误-但在不了解您的类型的情况下,直到下一个错误为止,它只能是膏药。有什么要求getText()
,要求它成为非静态?
已经有一些很好的答案,并解释了为什么不能与您的一起使用非静态Context
方法的混合。getText()
static final String
要问的一个好问题是:为什么要这样做?您正在尝试String
从strings
资源中加载a ,并将其值填充到public static
字段中。我认为这样做是为了让您的其他一些班级可以访问它?如果是这样,则不需要这样做。而是将a传递Context
到您的其他班级中,然后context.getText(R.string.TTT)
从其中进行调用。
public class NonActivity {
public static void doStuff(Context context) {
String TTT = context.getText(R.string.TTT);
...
}
}
并通过您的电话进行调用Activity
:
NonActivity.doStuff(this);
这将使您String
无需使用public static
字段即可访问资源。
String a[] = context.getTextArray(R.array.myStringArray);
;。但是,它给了我一个错误The method getTextArray(int) is undefined for the type Context
-为什么在与getText一起使用时为什么仍未定义?
对于在搜索中找到此内容的其他用户:
当我不小心使用类名而不是对象名调用函数时,经常会得到这个。这通常是因为我给他们起的名字太相似了:P
即:
MyClass myclass = new MyClass();
// then later
MyClass.someFunction();
这显然是静态方法。(对某些事情很有用)但是我真正想做的(在大多数情况下是)
myclass.someFunction();
这是一个愚蠢的错误,但是每隔几个月,我就浪费了大约30分钟来弄乱“ MyClass”定义中的var,以弄清楚我在做什么的确是错字。
有趣的是:堆栈溢出突出显示了使错误在这里真正明显的语法。