Android — общие настройки с двумя классами

В основном я хочу настроить один класс, чтобы иметь геттеры и сеттеры для устройства для хранения и извлечения данных, а другие классы для доступа к нему. Мне удалось заставить общие настройки работать в одном классе, но возникли проблемы с двумя классами (я знаком с Java, но не с Android, я где-то читал, что не должен использовать Activity, а должен быть статическим, и тоже не смог заставить это работать). В любом случае, это класс getter/setter.

public class Storage extends Activity {


@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

final SharedPreferences prefs = this.getSharedPreferences(
        "uk.co.kenreid.examplestory", Context.MODE_PRIVATE);

String nameKey = "uk.co.kenreid.examplestory.name";

Я обращаюсь к нему с помощью этих фрагментов кода в другом классе (final используется, поскольку переменная «хранилище» используется в onclicklistener):

final Storage storage = new Storage();

storage.storeItem("name", name);
System.out.println(storage.getString("name"));

person Dr Ken Reid    schedule 07.10.2013    source источник


Ответы (7)


Я полагаю, что ваша проблема заключается в инициализации SharedPreferences отдельно от Activity?

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

Eg.

SharedPreferences prefs;

public Storage(Context aContext){
    prefs = aContext.getSharedPreferences("uk.co.kenreid.examplestory", 
            Context.MODE_PRIVATE);
}

Затем получите доступ с помощью ваших исходных методов доступа. Возможно, лучше передать Application Context, а не Activity Context конструктору, поэтому, когда вы создаете свой класс Storage, вызовите его следующим образом в Activity:

Storage myStorage = new Storage(getApplicationContext());

Было бы целесообразно также создать класс Singleton, чтобы вы могли использовать один и тот же экземпляр Storage. В Интернете есть множество руководств по синглтонам в Java.

person biddulph.r    schedule 07.10.2013

попробуй это:

SharedPreferences prefs = this.getSharedPreferences("uk.co.kenreid.examplestory", Context.MODE_MULTI_PROCESS);
person Kristopher    schedule 07.10.2013
comment
Спасибо за ответ, но не повезло с этим. По-прежнему возникает следующая ошибка: FATAL EXCEPTION: main .... Невозможно запустить активность ComponentInfo (uk.co.kenreid.examplestory/uk.co.uk.kenreid.examplestory.start): hava.lang.NullPointerException - person Dr Ken Reid; 07.10.2013

Хранение чего-либо в общих настройках:

    SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE);  
    Editor ed = prefs.edit();  
    ed.putString(key, value);  
    ed.commit(); 

В вашем случае вы можете использовать приведенный выше код внутри метода onCreate.

Получение чего-либо из общих предпочтений:

    SharedPreferences prefs = getSharedPreferences("TOT", Context.MODE_PRIVATE);
    prefs.getString(key, null);
person Sayed Jalil Hassan    schedule 07.10.2013
comment
Спасибо за ответ, но у меня это работает в теории (как я уже упоминал, у меня это работает в одном классе, в частности, у меня проблемы с передачей/запуском действия/использованием статического контекста). - person Dr Ken Reid; 07.10.2013
comment
Хорошо понял. если вы запускаете операцию хранения только для доступа к общим данным о настройках, вам это не нужно. Вы можете получить к нему доступ вне активности, просто передав контекст. Во-вторых, вы начинаете деятельность неправильно. Чтобы запустить экземпляр действия, сделайте следующее: Intent mind = new Intent(context, Storage.class); startActivity(намерение). Примечание: если вы начинаете активность из класса, не являющегося активным, вам нужно будет передать контекст этому классу, а затем вы можете запустить его следующим образом: context.startActivity(intent); - person Sayed Jalil Hassan; 07.10.2013
comment
Сайед - спасибо, что помогли мне, вы были правы с первым пунктом, который вы сделали, но кто-то на самом деле написал ту часть кода, которую я использовал, и исправил проблему, но я хотел также лично поблагодарить вас за помощь и дать вам голос. вверх. Ваше здоровье. - person Dr Ken Reid; 07.10.2013

Попробуйте так:

SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());

mVariable = sharedPref.getBoolean(SettingsActivity.KEY_TO_VARIABLE, false);
person schabluk    schedule 07.10.2013
comment
Спасибо за ответ. Я получаю сообщение об ошибке getActivity() о том, что он не определен для типа Storage (имя класса). - person Dr Ken Reid; 07.10.2013


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

public class PreferenceManager {
    public static void setLogInSuceess(boolean login, Context context) {
        SharedPreferences preferences;
        preferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE);

        preferences.edit().putBoolean("LOGIN", login).commit();
    }

    public static boolean getLogInSuceess(Context context){
        SharedPreferences preferences;
        preferences = context.getSharedPreferences("settings", Context.MODE_PRIVATE);
        boolean login = preferences.getBoolean("LOGIN", false);

        return login;
    }
}

Используйте его, где хотите,

PreferenceManager.setLogInSucess (истина/ложь, контекст); логический _login = PreferenceManager.getLogInSucess (контекст);

person user2496783    schedule 07.10.2013

Попробуй это:

public class Storage extends Application

Application — это класс, используемый для обмена данными из Activity

person Dino Rino    schedule 07.10.2013
comment
Вы можете прокомментировать вашу оценку, пожалуйста? Я вижу класс Application в примере Scrumptious Facebook SDK, где, по моему мнению, он используется для обмена данными из разных действий. - person Dino Rino; 07.10.2013