在方法中使用getDefaultSharedPreferences

时间:2015-03-30 09:30:04

标签: java android android-studio sharedpreferences

所以我在一个名为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()括号中的内容?

3 个答案:

答案 0 :(得分:0)

PreferenceManager应与PreferenceActivity一起使用。

只需使用context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);

即可

答案 1 :(得分:0)

getDefaultSharedPreferences 要求您的应用程序上下文为参数, 试试这个,

    public class MyActivity extends ActionBarActivity
    {
    ......
    .......
    PreferenceManager.getDefaultSharedPreferences(MyActivity.this);
    ......
    ......

    }

答案 2 :(得分:0)

getDefaultSharedPreferences需要Context类的实例。 getActivity类声明了Fragment方法,因此,除非在任何onLoadFinish后继版中声明了Fragment方法,否则无法使用它。根据您的意见,如果我理解正确,onLoadFinish将在Activity内声明。如果是这样,您可以使用this关键字来传递上下文,因为ActivityContext的后继者。如果此方法在另一个类中声明,则应通过构造函数注入将上下文传递给它,例如。

编辑通过构造函数注入提供上下文的示例。

假设您有以下界面:

public interface MyInterface {
    void myAction();
}

你有一个实现它的类,需要一个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实例是通过构造函数注入的,我们没有对上下文保持强引用(实际上它取决于特定需求)。可以通过以下方式在Activity内使用此类:

MyClass myClass = new MyClass(this);

或者片段内部:

MyClass myClass = new MyClass(getActivity());