在方法中使用 getDefaultSharedPreferences
Using getDefaultSharedPreferences in a method
所以我在一个名为 onLoadFinish 的方法中使用了 getdefaultsharedpreferences(它来自 android 的 pdf 库)。
这是代码:
public void onLoadFinish(DocumentState.OPEN state) {
//some irrelevant code here
SharedPreferences pref= PreferenceManager.getDefaultSharedPreferences(getActivity());
String text = pref.getString("example_list","");
int foo = Integer.parseInt(text);
goToPage(foo);
//some irrelevant code there
}
所以代码的主要任务是从我的example_list偏好中获取一个值(一个字符串),将其转化为一个整数并将这个整数放入我的goTopage();
,这使得应用程序跳转到我的pdf文档中的某个页面。
问题出在这部分:
PreferenceManager.getDefaultSharedPreferences(getActivity())
getActivity 不工作。我也尝试过 getApplicationContext() 。 getDefaultSharedPreferences() 的括号中应该是什么?
PreferenceManager 应该与 PreferenceActivity 一起使用。
只需使用context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
getDefaultSharedPreferences 需要您的应用程序上下文参数,
试试这个,
public class MyActivity extends ActionBarActivity
{
......
.......
PreferenceManager.getDefaultSharedPreferences(MyActivity.this);
......
......
}
getDefaultSharedPreferences expects an instance of Context
class. getActivity method is declared in the Fragment class, so, unless your onLoadFinish
method is declared in any Fragment
successor, you can't use it. Per your comments, if I understood you correctly, onLoadFinish
is declared inside Activity。如果是这样,您可以只使用 this
关键字来传递上下文,因为 Activity
是 Context
的后继者。如果此方法在另一个 class 中声明,您应该将上下文传递给它,例如通过构造函数注入。
编辑 通过构造函数注入提供上下文的示例。
假设您有以下接口:
public interface MyInterface {
void myAction();
}
你有一个 class,它实现了它并需要一个 Context
的实例来完成工作:
public class MyClass implements MyInterface {
private WeakReference<Context> mContext;
public MyClass(Context context) {
this.mContext = new WeakReference<Context>(context);
}
@Override
public void myAction() {
Context ctx = mContext.get();
if (ctx != null){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
//do stuff
}
}
}
如您所见,Context
实例是通过构造函数注入的,我们没有保留对上下文的强引用(实际上这取决于具体需求)。这个 class 可以在 Activity
中使用,方法如下:
MyClass myClass = new MyClass(this);
或内部片段:
MyClass myClass = new MyClass(getActivity());
所以我在一个名为 onLoadFinish 的方法中使用了 getdefaultsharedpreferences(它来自 android 的 pdf 库)。 这是代码:
public void onLoadFinish(DocumentState.OPEN state) {
//some irrelevant code here
SharedPreferences pref= PreferenceManager.getDefaultSharedPreferences(getActivity());
String text = pref.getString("example_list","");
int foo = Integer.parseInt(text);
goToPage(foo);
//some irrelevant code there
}
所以代码的主要任务是从我的example_list偏好中获取一个值(一个字符串),将其转化为一个整数并将这个整数放入我的goTopage();
,这使得应用程序跳转到我的pdf文档中的某个页面。
问题出在这部分:
PreferenceManager.getDefaultSharedPreferences(getActivity())
getActivity 不工作。我也尝试过 getApplicationContext() 。 getDefaultSharedPreferences() 的括号中应该是什么?
PreferenceManager 应该与 PreferenceActivity 一起使用。
只需使用context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);
getDefaultSharedPreferences 需要您的应用程序上下文参数, 试试这个,
public class MyActivity extends ActionBarActivity
{
......
.......
PreferenceManager.getDefaultSharedPreferences(MyActivity.this);
......
......
}
getDefaultSharedPreferences expects an instance of Context
class. getActivity method is declared in the Fragment class, so, unless your onLoadFinish
method is declared in any Fragment
successor, you can't use it. Per your comments, if I understood you correctly, onLoadFinish
is declared inside Activity。如果是这样,您可以只使用 this
关键字来传递上下文,因为 Activity
是 Context
的后继者。如果此方法在另一个 class 中声明,您应该将上下文传递给它,例如通过构造函数注入。
编辑 通过构造函数注入提供上下文的示例。
假设您有以下接口:
public interface MyInterface {
void myAction();
}
你有一个 class,它实现了它并需要一个 Context
的实例来完成工作:
public class MyClass implements MyInterface {
private WeakReference<Context> mContext;
public MyClass(Context context) {
this.mContext = new WeakReference<Context>(context);
}
@Override
public void myAction() {
Context ctx = mContext.get();
if (ctx != null){
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctx);
//do stuff
}
}
}
如您所见,Context
实例是通过构造函数注入的,我们没有保留对上下文的强引用(实际上这取决于具体需求)。这个 class 可以在 Activity
中使用,方法如下:
MyClass myClass = new MyClass(this);
或内部片段:
MyClass myClass = new MyClass(getActivity());