Android - Споделено предпочитание с два класа

По принцип искам да настроя един клас, който да има гетери и сетери към устройството за съхраняване и извличане на данни, както и други класове за достъп до него. Успях да накарам sharedpreferences да работят в един клас, но имам проблеми с два класа (запознат съм с Java, но не и Android, прочетох някъде, че не трябва да използвам Activity, а static, и не можах да накарам и това да работи). Във всеки случай тук е класът 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 се използва, тъй като променливата "storage" се използва в 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 myStorage = new Storage(getApplicationContext());

Може да е разумно да създадете и клас Singleton, за да ви позволи да използвате същото копие на Storage. В мрежата има много уроци за Singletons в 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 intent = 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

проверете документа на getSharedPreferences

Тук първият параметър е името на споделеното предпочитание, където съхранявате данните. Така че трябва да използвате едно и също име от всеки клас, за да имате достъп до едни и същи споделени предпочитания.

person stinepike    schedule 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.setLogInSuceess(true/false, context); boolean _login = PreferenceManager.getLogInSuceess(контекст);

person user2496783    schedule 07.10.2013

Опитайте тази:

public class Storage extends Application

Приложението е клас, използван за споделяне на данни от дейности

person Dino Rino    schedule 07.10.2013
comment
Можете ли да коментирате оценката си, моля? Виждам класа Application в Scrumptious пример на Facebook SDK, където според мен се използва за споделяне на данни от различни дейности. - person Dino Rino; 07.10.2013