2013-12-11 3 views
1

У меня есть приложение на Android 4.0. Он использует класс PreferenceManager для - среди прочего - позволяет пользователю указать, сколько десятичных знаков числа показывать.Доступ к контексту приложения в классе хранения в Android

mPreferences = PreferenceManager.getDefaultSharedPreferences(this); 

Как правило, у меня нет проблем с контекстом приложения, чтобы получить доступ к диспетчеру предпочтений. Моя проблема в том, что у меня есть класс (назовем его Record), который не подклассифицирует все, что имеет контекст приложения; это просто класс хранения, но у него есть поле «NumDecPlaces». Прямо сейчас, когда я создаю экземпляр класса из своего приложения, я просто передаю предпочтение #dec в пользовательских предпочтениях. Было бы неплохо, если запись могла напрямую обращаться к диспетчеру предпочтений. Я полагаю, что всегда мог бы создать экземпляр Record с указателем на контекст, из которого он был создан, но это очень важно запомнить ;-)

Так что прямо сейчас не записывайте подклассы. Любые рекомендации по тому, что я могу сделать, чтобы он мог видеть контекст приложения?

Спасибо!

ответ

2

Вы можете передать объект Context в конструктор. Поэтому всякий раз, когда вы пытаетесь использовать этот класс, он попросит вас передать объект Context, а затем использовать его для получения SharedPreferences

Для примера.

public Record(Context context) 
{ 
    mContext = context; 

    mPreferences = PreferenceManager.getDefaultSharedPreferences(mContext) 
} 
+0

Да, это была моя первая реакция на проблему. Как я уже говорил, я просто пытался избежать «помнить», чтобы создать контекст. Это действительно не большая проблема, и это происходит почти везде в Android-разработке, поэтому я не знаю, почему я отказался. – Chris

+0

Да, вам нужно будет либо передать объект Context или объект SharedPrefrences в свой конструктор. – Apoorv

+0

... и я действительно слишком много жалуюсь на дополнительную работу. Eclipse очень хорошо напоминает мне. – Chris

0

Вы можете сделать предложение @ Apoorv или создать другой класс, который специально хранит контекст приложения.

public class ContextResolver { 

    private static Context context; 

    public static void setContext(Context context) { 
     if (context == null) { 
      throw new IllegalArgumentException("Context must not be null"); 
     } else if (context instanceof android.app.Activity) { 
      context = androidContext.getApplicationContext(); 
     } else if (context instanceof android.content.Context) { 
      context = androidContext; 
     } 
    } 
    public Context getContext() { 
     return context; 
    } 
} 

Теперь вам нужно вызвать SetContext() в первой деятельности, которая будет запущена раз.

public class MyFirstActivity extends Activity { 
    public void onCreate() { 
     ContextResolver.setContext(this); 
    } 
} 

Теперь вы можете получить Контекст из любой части вашего кода. Так что в вашем классе записи вы можете просто сделать это:

mPreferences = PreferenceManager.getDefaultSharedPreferences(ContextResolver.getContext()); 
+0

Это интересно. Я попробую это сегодня вечером и взвесьте его против опции just-pass-in-a-context. – Chris

0

Вы также можете расширить класс с Application, который будет глобальным для всего приложения, и вы можете установить контекст в этом классе в качестве переменной-члена и что контекст будет глобальным для всей заявки

Например. класс A расширяет Приложение {......}

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