【问题标题】:Getting context for SharedPreferences in a method在方法中获取 SharedPreferences 的上下文
【发布时间】:2015-06-10 18:35:06
【问题描述】:

所以我的应用程序中有一个 pdf 插件,它使用公共类 SimpleDocumentReader。这只是一堂课,而不是活动。我有一种方法,您可以在完成加载后更改文档的页面:

@Override    
public void onLoadFinish(DocumentState.OPEN state) {
    if (state == OPEN.SUCCESS) {
    SharedPreferences pref= PreferenceManager.getDefaultSharedPreferences();
                String page = pref.getString("example_list","");
                goToPage(Integer.parseInt(page));
       }
    }

如您所见,我想访问 defaultsharedpreferences,其中存储了一个字符串,我可以使用该字符串更改页面。问题是,在 getDeaultSharedPreferences() 的方括号中;我需要上下文。我已经尝试了几件事:

getApplicationContext()(没用),

getActivity() 也很愚蠢。

还尝试让方法接收这样的上下文:

public void onLoadFinish(DocumentState.OPEN state, Context context) {

// line for getting sharedpreferences Context:
SharedPreferences pref= PreferenceManager.getDefaultSharedPreferences(context);
}

但它会引发几个错误: 首先,@Override 不起作用,因为

方法不会覆盖其超类中的方法

第二个错误在顶部,类本身:

public class SimpleDocumentReader implements ReaderListener {}

抛出此错误:

类“SimpleDocumentReader”必须在ReaderListener 中声明为抽象或实现抽象方法“onLoadFinish(OPEN)”。

这是什么意思?

编辑:下面是 SimpleDocumentReader 类的启动方式:

首先,在我的 Activity 中创建一个带有 SimpleReaderFactory 的 SimpleViewer:

SimpleDocumentReader v = SimpleReaderFactory.createSimpleViewer(this, null);
v.openUrl("myurl", "mypassword");

二、SimpleReaderFactory:

public class SimpleReaderFactory {

    /**
     * Creates and returns a PDF viewer used for viewing, reading, and
     * navigating PDF document
     * 
     * @param act
     *            The activity of the current application.
     * @param listener
     *            The SimpleDocumentViewerListener instance.
     * 
     * @return SimpleDocumentViewer The default PDF document viewer instance
     */
    public static SimpleDocumentReader createSimpleViewer(Activity act,
            SimpleDocumentReaderListener listener) {

        SimpleDocumentReader viewer = new SimpleDocumentReader(act);
        viewer.setListener(listener);


        return viewer;
    }
}

最后,我的 SimpleDocumentReader:

    public class SimpleDocumentReader implements ReaderListener {
    // a lot of stuff here, I will post the important snippets of code:
    public void onLoadFinish(DocumentState.OPEN state) {
    if (state == OPEN.SUCCESS) {
                mControlView.init(mAct);

                RelativeLayout layout = new RelativeLayout(mAct);
                layout.addView(mReaderView);
                layout.addView(mControlView);

                mAct.setContentView(layout);

                CoordConverter.initCoordConverter(mAct, mReaderView);
                SharedPreferences pref= 
//my attempts at getting the defaultsharedpreferences
PreferenceManager.getDefaultSharedPreferences();
                String hour = pref.getString("example_list","");
                goToPage(Integer.parseInt(hour));
            }
}

【问题讨论】:

  • 你在哪里实现LoaderManager.LoaderCallbacks接口?
  • 我在代码中的任何地方都没有找到该接口(项目搜索),但如果您愿意,我可以粘贴 SimpleDocumentReader 类的整个代码。

标签: java android methods android-studio sharedpreferences


【解决方案1】:

这是什么意思?

正如它所说的那样。 ReaderListener 要求你有一个onLoadFinish() 签名public void onLoadFinish(DocumentState.OPEN state),显然。

关于你的整体问题,将SharedPreferences 传递给SimpleDocumentReader 的构造函数,它在数据成员中保存它并在onLoadFinish() 中使用它。

【讨论】:

  • @just_deko:“我的 ReaderListener 接口中有一个方法”——正确。我在回答的第一段中提到了这一点。
  • @just_deko:我不确定final 会在那里工作。但是向SimpleDocumentReader 添加一个以SharedPreferences 作为参数的构造函数。在该构造函数中,将 SharedPreferences 分配给您的 sharedprefs 数据成员。在其他地方,当您需要SharedPreferences 时,请参考sharedprefs
  • @just_deko:“构造函数”是指“构造函数”。根据您的说法,“它只是一个类,而不是一个活动”,因此添加构造函数是完全合理的。如果您愿意,欢迎您使用其他类型的 setter 方法,尽管我不知道这样做有什么好处。
  • @just_deko:声明你的构造函数(例如,public SimpleDocumentReader(SharedPreferences p) { ... })。然后在创建SimpleDocumentReader 实例时传递SharedPreferences(例如new SimpleDocumentReader(PreferenceManager.getDefaultSharedPreferences(...)),其中...Context,例如您的Activity)。
  • @just_deko:有些东西正在创建您的SimpleDocumentReader 的实例。我不知道它是什么。然而,Android 中的 everythingContext 开头。例如,如果创建SimpleDocumentReader 以支持Activity,则某处 Activity 将触发一系列调用,最终导致您创建SimpleDocumentReader 的实例。您需要安排在这一系列电话中拨打SharedPreferences
猜你喜欢
  • 2018-09-02
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2016-06-20
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
相关资源
最近更新 更多