2015-03-30 2 views
0

Так что я использую getdefaultsharedpreferences в методе onLoadFinish (это из библиотеки pdf от android). Вот код:Использование getDefaultSharedPreferences в методе

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()?

+0

что вы имеете в виду 'getActivity не working'? – nikis

+0

«Невозможно разрешить метод getActivity()» « –

+0

вы вызываете его внутри фрагмента? – nikis

ответ

0

getDefaultSharedPreferences ожидает экземпляр класса Context. getActivity метод объявлен в классе Fragment, поэтому, если ваш метод onLoadFinish не объявлен ни в одном преемнике Fragment, вы не можете его использовать. За ваши комментарии, если я правильно вас понял, onLoadFinish объявлен внутри Activity. Если это так, вы можете просто использовать ключевое слово , чтобы передать контекст, потому что Activity является преемником Context. Если этот метод объявлен в другом классе, вы должны передать ему контекст, например, путем инъекции конструктора.

EDIT Пример предоставления контекста через инъекцию конструктора.

Допустим, у вас есть следующий интерфейс:

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()); 
+0

Хорошо, когда я использую «это», студия Android говорит, что «это» не может быть применена к моему классу «SimpleDocumentReader» и хочет, чтобы SimpleDocumentReader расширил «Android.content.Context». Должен ли я это делать? –

+0

@just_deko вы уверены, что 'SimpleDocumentReader' является активностью? можете ли вы показать подпись класса, в котором вы реализовали интерфейс SimpleDocumentReaderListener? – nikis

+0

'public class SimpleDocumentReader реализует ReaderListener {}' Вы имеете в виду это? –

0

PreferenceManager должен использоваться с PreferenceActivity.

Просто используйте context.getSharedPreferences("pref_name", Context.MODE_PRIVATE);

+0

Ваш первый оператор неверен, его можно использовать где угодно, ему просто нужен экземпляр класса Context. – nikis

0

getDefaultSharedPreferences требуется контекст вашего приложения параметр, Попробуйте это,

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

    } 
Смежные вопросы