Использование класса SharedPreferences в Android?
Я создал класс SharedPreferences, чтобы остальные мои действия могли использовать онлайн для получения настроек.
public class SPAdapter extends Activity {
public final String preferenceSettings = "STORAGE";
// Default value if row does not exist in preference
public static final String rowExistence = "Row did not exist";
public String prefGet(String preferenceName, String rowId) {
SharedPreferences preferenceObject = getSharedPreferences(preferenceName, MODE_PRIVATE);
String value = preferenceObject.getString(rowId, rowExistence);
return value;
}
Я использую этот метод так:
public class Splash extends Activity {
private SPAdapter spObject;
public String rowNumber(0);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
spObject.prefGet(spObject.preferenceSettings,
rowNumber);
}
Однако всякий раз, когда я пытаюсь использовать этот метод, приложение вылетает, показывая ошибку о контексте. Кто-нибудь может мне помочь заставить это работать?
1 ответ
Проблема этого подхода заключается в том, что вы расширяете SPAdapter из Activity и не инициализируете его должным образом, у него нет правильного набора контекста, поэтому он не может получить экземпляр SharedPreferences из инфраструктуры через него. Но в любом случае, это не то, как вы должны делать что-то в Android, вы не тот, кто создает новые объекты Activity, это должно быть работой фреймворка. Вот 2 способа заставить это работать:
Расширьте свою активность Splash из SPAdapter.
Не расширяйте SPAdapter из Activity, просто передайте ссылку на объект Context и получите экземпляр SharedPreferences, используя его. Что-то вроде этого:
открытый класс SPAdapter {public final String preferenceSettings = "STORAGE";
// Default value if row does not exist in preference public static final String rowExistence = "Row did not exist"; private Context ctx; public SPAdapter(Context ctx){ this.ctx = ctx; } public String prefGet(String preferenceName, String rowId) { SharedPreferences preferenceObject = ctx.getSharedPreferences( preferenceName, Context.MODE_PRIVATE); String value = preferenceObject.getString(rowId, rowExistence); return value; }
}
Используйте это так:
public class FsActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
SPAdapter sa = new SPAdapter(getApplicationContext());
sa.prefGet("", "");
}
}
Первое решение кажется немного лучше IMO.