Как ссылаться на sh значение, которое я получаю от SharedPreference при запуске действия - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу очистить данные, которые я получаю от SharedPreference, я пытаюсь найти следующий ответ, но не выполнил свою задачу:

1) как удалить общие предпочтения, выйти и запустить приложение сначала actvity в android

2) очистить значение общих настроек

3) Удалить пары ключ / значение общих настроек

4) SharedPreferences Очистить / Сохранить

все они удаляют значение после записи данных в SharedPreference, например, editor.remove и .clear ...

У меня есть запись данных в SharedPreference в уведомлении деятельности, как это:

public static final String PREFS_NAME = "com.example.sociapp";

NotificationAdapter notificationAdapter1 = new NotificationAdapter(NotificationsActivity.this, NotificationList, NKeyList);
                    RnotificationList.setAdapter(notificationAdapter1);
                    isthereItem = notificationAdapter1.getItemCount();
                    Toast.makeText(NotificationsActivity.this, ""+isthereItem, Toast.LENGTH_SHORT).show();

                    //writing data into SharedPreference
                    SharedPreferences.Editor editor = settings.edit();
                    editor.putInt("changingicon",isthereItem);
                     //editor.commit();
                    editor.clear();
                    editor.apply();

И я получаю это значение int в MainActivity, как это:

        SharedPreferences settings = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);

 // Reading from SharedPreferen  
try {
//all I want to refresh below line everytime I start MainActivity.
      int ChangeIcon = settings.getInt("changingicon", 0);
      if (ChangeIcon == 0)
      {
          int valuebecomes = 0;
          notificationIconSetting(valuebecomes);
      }
      else
          {
              int valuebecomes = 1;
              notificationIconSetting(valuebecomes);
          }

      Toast.makeText(MainActivity.this, ""+ChangeIcon, Toast.LENGTH_SHORT).show();

  }
  catch (ClassCastException e){e.printStackTrace();}

Метод, который я вызываю, когда я получить значение int из SharedPreference:

 private void notificationIconSetting(int IconTochange)
    {
       if (IconTochange == 0) {

           navigationView.getMenu().getItem(2).setIcon(R.drawable.notification);
       }
       else
           {
               navigationView.getMenu().getItem(2).setIcon(R.drawable.notificationalert);
               navigationView.setItemIconTintList(null);

           }
    }

На самом деле я получаю значение int больше 0, когда в адаптере есть уведомление, а когда в адаптере нет уведомления, значение int равно 0 тогда я использую это значение для изменения значка уведомления.

Когда есть уведомление:

screenshot

Когда нет уведомления:

screenshot

Теперь проблема заключается в том, что всякий раз, когда я получаю значение, оно остается неизменным до тех пор, пока я не очищу кэш приложения или не удалю, а затем не установлю снова. Все, что я хочу обновить sh значение SharedPreference каждый раз, когда я запускаю MainActivity.

1 Ответ

0 голосов
/ 28 апреля 2020

Вы хотите удалить один ключ / значение из общего предпочтения, вот как я это делаю.

public  void clearSpecificKey(String key){

    sharedPreferences.edit().remove(key).apply();
}

Несколько замечаний: вы должны создать общий c класс общих предпочтений, как показано ниже

publi c class SharedPrefs {

private static final String MY_PREFS_NAME = "YOUR-PREFERENCE-NAME";

private static SharedPreferences sharedPreferences;
private String masterKeyAlias;
public SharedPrefs(Context context) {

    {
        try {
            masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC);
        } catch (GeneralSecurityException | IOException e) {
            e.printStackTrace();
        }
    }
    try {
        sharedPreferences = EncryptedSharedPreferences.create(MY_PREFS_NAME,masterKeyAlias,context,
                EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
                EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM);
    } catch (GeneralSecurityException | IOException e) {
        e.printStackTrace();
    }

}

public  String getStrings(Context mContext, String key){
    return sharedPreferences.getString(key, null);
}

public  void putString(Context mContext, String key, String value ){
    sharedPreferences.edit().putString(key, value).apply();
}

public  boolean getBoolean(Context mContext, String key){
    return sharedPreferences.getBoolean(key, false);
}

public  void putBoolean(Context mContext, String key, boolean value ){
    sharedPreferences.edit().putBoolean(key, value).apply();
}


public static void clear(Context mContext){
  sharedPreferences.edit().remove("user").apply();
}

public  void clearSpecificKey(String key){
    sharedPreferences.edit().remove(key).apply();

}

}

Вот как это использовать

Объявление:

SharedPrefs sharedPrefs;

Инициализация:

sharedPrefs = new SharedPrefs(context);

просто вызовите методы, которые вы хотите использовать для сохранения значения в общем предпочтении, например

sharedPrefs.putString(context,key,value)

masterKeyAlias ​​- это защита моих общих настроек.

Добавьте это приложение.

implementation "androidx.security:security-crypto:1.0.0-beta01"

Подробнее об этом можно прочитать здесь Best Practices

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...