【发布时间】:2012-07-04 02:55:18
【问题描述】:
我学习 Java 大约 6 周,但仍在努力实现静态方法(我以为我真的理解它,但这证明我错了!)。
我正在尝试公开本地存储的键值对的值。这是我的初始代码:
public class Settings extends Activity implements OnClickListener {
public Settings(TextView loginText, TextView passwdText) {
super();
this.loginText = loginText;
this.passwdText = passwdText;
}
public static String getDriverNum() {
SharedPreferences sp = getSharedPreferences(DELEX_SP, MODE_PRIVATE); <---ERROR
String Login = sp.getString("KeyLgn", "No Login Found");
return Login;
}
当然,我得到一个错误“Cannot make a static reference to the non-static method getSharedPreferences(String, int) from type ContextWrapper”,所以我尝试将非静态方法包装在我自己的公共方法中,正如类似的 StackOverflow answer 所示:
public class Settings extends Activity implements OnClickListener {
public Settings(TextView loginText, TextView passwdText) {
super();
this.loginText = loginText;
this.passwdText = passwdText;
}
public static String getDriverNum() {
String Login = getSharedPref().getString("KeyLgn", "No Login Found"); <-- SAME ERROR
return Login;
}
public SharedPreferences getSharedPref() {
SharedPreferences sp = getSharedPreferences(DELEX_SP, MODE_PRIVATE);
return sp;
}
但这只是导致了同样的错误,因为我还没有解决对非静态 getSharedPreferences 方法的调用。解决此问题的最佳方法是什么?是不是要创建一个包装 getSharedPreferences 的类?
感谢您在我为静态命名法苦苦挣扎时的耐心等待。
【问题讨论】:
-
我正在尝试公开本地存储的键值对的值。 - 除了静态方法的问题之外,基本上不要 尝试使用 Android Activity 执行您正在执行的操作。这违背了Android的设计理念。 Android Activity 是一个特例类,您不应公开(静态或其他)任何字段或方法 - 学习/接受这一点或为将来的问题做好准备。要做你想做的事,你可能应该扩展 Application 类 - 永远不要在 Activity 中这样做。
-
谢谢。我实际上已经创建了一个非 Activity 类来实现我的键值方法,但在那里也遇到了问题(当然)。因此,尝试将其暂时移至 Settings(一个 Activity 类),作为测试平台,看看是否存在 onCreate 固有的东西会有所帮助(是的,我知道,现在回想起来很愚蠢,但我很绝望)。将把它移回非 Activity 类。
-
还有哪些“类”需要该方法?
-
@Squonk - 几个课程,请看我对 Tom 的回复,如下所示。
-
对不起,我应该问什么类“类型”。例如,如果有几个扩展
Activity的类,并且您试图避免代码重复,您可以简单地创建一个“基础”Activity类并在其上实现该方法,然后为所有其他类扩展它Activities。就个人而言,我可能会在单例模型中扩展SQLiteOpenHelper并将DriverNum存储在数据库中。这样你就可以在SQLiteOpenHelper上拥有访问DriverNum的公共方法。只是另一个需要考虑的角度,因为我倾向于使用 SQLite DB 而不是SharedPreferences。祝你好运。
标签: java android instantiation static