Сохранение sharedPreferences в классе View

Мне нужно сохранить некоторую информацию, то, что я использовал в прошлом, это общие настройки...

SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putString("Data", (Data));
editor.commit();

Итак, я бы сделал что-то подобное, чтобы сохранить данные, однако для этого проекта я использую класс типа public class Tab3 extends View implements OnTouchListener, и я не уверен, почему это не работает, но я не могу использовать общие настройки onTouch. Я получаю сообщение об ошибке getSharedPreferences говоря: «Метод getSharedPreferences (String, int) не определен для типа Tab3», что мне нужно сделать, чтобы каким-то образом сохранить эти данные, чтобы я мог использовать их позже в своем приложении?


person Michael Zeuner    schedule 18.05.2012    source источник


Ответы (2)


Вам нужен контекст, чтобы получить доступ к общим настройкам. Лучший способ — создать MyApplication как потомка класса Application, создать там экземпляр preferences и использовать их в остальной части вашего приложения как MyApplication.preferences:

public class MyApplication extends Application {
    public static SharedPreferences preferences;

    @Override
    public void onCreate() {
        super.onCreate();

        preferences = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);

Например, если вам нужен доступ к вашим настройкам где-то еще, вы можете вызвать это, чтобы прочитать настройки:

String str = MyApplication.preferences.getString( KEY, DEFAULT );

Или вы можете вызвать это, чтобы сохранить что-то в настройках:

MyApplication.preferences.edit().putString( KEY, VALUE ).commit();

(не забудьте вызвать commit() после добавления или изменения настроек!)

person lenik    schedule 18.05.2012
comment
Не могли бы вы отредактировать этот вопрос, чтобы показать мне, как я могу сохранить что-то, используя это, а также как я могу перезвонить? это было бы здорово спасибо! - person Michael Zeuner; 19.05.2012
comment
вот мои файлы кода, я все еще очень смущен тем, что я сделал неправильно, может быть, это поможет больше... mediafire.com/?ztirv21vkjk2i8r , mediafire.com/?jchkydzjazwwfze и mediafire.com/?llwi1r4zyvr0icy - person Michael Zeuner; 19.05.2012
comment
в вашем SectionManager.java вы должны использовать тот же MyApplication.preferences, что и в других ваших файлах. прямо сейчас у вас есть два разных предпочтения, неудивительно, если вы напишете одно, другое останется прежним. - person lenik; 19.05.2012
comment
Я изменил его на это, и DataInfo по-прежнему передается как Unknown? вот файл, убедитесь, что я сделал то, что вы упомянули. mediafire.com/?8148t4u9z5r8iiu - person Michael Zeuner; 19.05.2012
comment
похоже, вы используете разные аргументы KEY для putString и для getString, то есть «Данные» и «Информация о данных». Кроме того, значение, которое вы сохраняете, представляет собой строку «Неизвестно», которую можно легко спутать с «Неизвестно» — пожалуйста, измените ее на что-то другое, а также на КЛЮЧ, упомянутый выше. - person lenik; 19.05.2012

Я бы сделал то, что говорит lenik, но не делал бы их статичными, вместо этого ленив их инициализировать.

public class MyApplication extends Application {
    public SharedPreferences preferences;

    public SharedPreferences getSharedPrefs(){
         if(preferences == null){
              preferences = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);
         }
         return preferences;
    }

Тогда на ваш взгляд:

 MyApplication app = (MyApplication) getContext().getApplicationContext();
 SharedPreferences settings = app.getSharedPrefs();

Как говорит Эрик, этот класс приложения должен быть объявлен в вашем манифесте:

<application android:name=".MyApplication" 
       android:icon="@drawable/icon" 
       android:label="@string/app_name">

Ссылка:

getApplicationContext()

Глобальные переменные Android


изменить

(Из вашего комментария) проблема в том, что вы на самом деле не сохраняете никаких данных, эта строка не имеет смысла, вы на самом деле не сохраняете переменную:

 editor.putString("Data", (Data));

Вот пример вышеизложенного в использовании:

MyApplication app = (MyApplication) getContext().getApplicationContext();
SharedPreferences settings = app.getSharedPrefs();
String str = settings.getString("YourKey", null);

И чтобы сохранить что-то в настройках:

settings.edit().putString("YourKey", "valueToSave").commit();

Более конкретным примером использования в пользовательском представлении может быть:

public class MyView extends View {

   SharedPreferences settings;

     // Other constructors that you may use also need the init() method

     public MyView(Context context){
         super(context);
         init();
     }

      private void init(){
         MyApplication app = (MyApplication) getContext().getApplicationContext();
         settings = app.getSharedPrefs();
      }

      private void someMethod(){ // or onTouch() etc
          settings.edit().putString("YourKey", "valueToSave").commit(); //Save your data
      }

      private void someOtherMethod(){
          String str = settings.getString("YourKey", null); //Retrieve your data
      }

}
person Blundell    schedule 18.05.2012
comment
Здорово! Итак, как я буду сохранять данные в этом, а затем вызывать его позже? - person Michael Zeuner; 19.05.2012
comment
@MichaelZeuner, как вы написали в своем вопросе, когда у вас есть экземпляр общих настроек, используйте его, как хотите. - person Blundell; 19.05.2012
comment
Я все еще немного сбит с толку, что я должен сохранить, это MyApplication app = (MyApplication) getContext().getApplicationContext(); SharedPreferences settings = app.getSharedPrefs(); SharedPreferences.Editor editor = settings.edit(); editor.putString("Data", (Data)); editor.commit();, а затем перезвонить, у меня есть MyApplication app = (MyApplication) getContext().getApplicationContext(); SharedPreferences settings = app.getSharedPrefs(); Data = (settings.getString("Data", "unKnown"));, что я сделал не так? - person Michael Zeuner; 19.05.2012
comment
@Blundell, ты все упустил. если вы не сделаете их статичными, вы не сможете получить доступ к предпочтениям из тех мест, где нет context, что и является основной целью этого упражнения — сделать настройки доступными везде. - person lenik; 19.05.2012
comment
@lenik Он хотел SharedPreferences в классе View. Здесь у вас всегда есть контекст. - person Blundell; 19.05.2012
comment
@MichaelZeuner Вы не сделали ничего плохого, просто проверьте (выйдите из системы), что вы сохраняете и что извлекаете. я отредактировал ответ - person Blundell; 19.05.2012
comment
@Blundell, так что вместо простого, элегантного решения, которое работает на 100%, если время, вы предлагаете решение, которое довольно громоздко и, как вы знаете, ломается, как только он отходит от использования View. ты не думаешь, что это жестоко поступать с новичком? - person lenik; 19.05.2012
comment
@lenik Ваше решение не подлежит тестированию (модульные тесты) и в реальном мире никогда не будет использоваться в производственном коде. Его вопрос был специфичен для View, поэтому я дал ему лучший доступный ответ, он далеко не громоздкий, он довольно элегантный и может быть в любом пользовательском компоненте Android. - person Blundell; 19.05.2012