Как создать класс специально для использования SharedPreferences? - PullRequest
0 голосов
/ 26 октября 2010

В моем приложении есть пара действий, которые я хотел бы использовать в общих настройках. Первоначально я создал метод в каждом действии, чтобы использовать SharedPreferences, который работал нормально. Однако, поскольку есть несколько действий, которые используют одни и те же данные, я в основном использую похожие методы в разных местах. Таким образом, казалось, что было более разумно создать класс специально для обработки всех этих методов.

К сожалению, я не понимаю, как это сделать правильно.

Это не скомпилируется, потому что в нем говорится «getSharedPreferences не определено для типа AppPrefs».

public class AppPrefs {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

Наконец, я подумал, может, поскольку SharedPreferences - это интерфейс, я мог бы сделать это, но тогда мне нужно было бы реализовать унаследованные методы. У меня нет причин переопределять какие-либо из этих методов, поэтому также нет причин делать это.

public class AppPrefs implements SharedPreferences {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

Что здесь имеет смысл делать? Есть ли концепция, которую я пропускаю? Кто-нибудь может уточнить и объяснить? Спасибо.

Ответы [ 2 ]

1 голос
/ 26 октября 2010

Передайте свой контекст в ваш получатель предпочтений.

public class AppPrefs {
 public static void foo(Context ctx) {
  SharedPreferences settings = ctx.getSharedPreferences("MyAppPrefs", 0);
 } 
}

Теперь просто перейдите this из класса деятельности к foo()

1 голос
/ 26 октября 2010

Если настройки являются глобальными для приложения, вы можете использовать PreferenceManager.getDefaultSharedPreferences();, когда вам нужно получить доступ к общим настройкам. Если настройки относятся к подмножеству Activities, у вас есть несколько различных вариантов:

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

public abstract class AbstractFooActivity extends Activity
{
    protected SharedPreferences getFooPreferences()
    {
        return getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    }

    private static final String PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends AbstractFooActivity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getFooPreferences();
    }
}

Или, если вы, как и я, не хотите связываться с иерархией классов, вы можете просто создать общее постоянное значение для группы действий, которым требуется доступ к предпочтениям. Это полезно в ситуации, когда у вас есть класс вне иерархии Activity, который должен получить доступ к предпочтениям. Например, Service.

public final class FooConstants
{
    public static final String FOO_PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends Activity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

public class AFooService extends Service
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

Второй метод немного менее инкапсулирован, но налагает меньше ограничений на иерархию объектов, что, на мой взгляд, является хорошим компромиссом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...