Использование класса 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.

Другие вопросы по тегам