Android. Изменяемая константа элемента в файле

226
30 ноября 2017, 01:58

Имеется вот такой код:

                                       ...
                public static final String APP_STORAGE = "AppStorageFile";                    
                public static final String Name_1 = "TextName7";
                private SharedPreferences SFE;
                @Override
                    protected void onCreate(final Bundle savedInstanceState) 
                    {
                        super.onCreate(savedInstanceState);
                        setContentView(R.layout.activity_main);
                        SFE = getSharedPreferences(APP_STORAGE, Context.MODE_PRIVATE);
                                       ...
                        SharedPreferences.Editor editor = SFE.edit();
                        editor.putString(Name_1, "Привет мир"));
                        editor.apply();
                        i = 1;
                        String Name_number = "Name_" + String.valueOf(i);
                        Log.d("TAG_LOG", Name_number);
                        if (SFE.contains(Name_number))
                        {
                            Log.d("TAG_LOG", "Зашло");
                        } else{
                            Log.d("TAG_LOG", "Не зашло");
                        }
                    }

В итоге, в логах пишется: Name_1 Не зашло

Как правильно написать, чтобы мне выдавало в логах Зашло и при этом иметь возможность изменять значение в скобках.

Для каждого Name_i, где i=1,2...100 имеется один и тот же код. И чтобы его не расписывать 100 раз, я как раз и решил использовать String Name_number = "Name_" + String.valueOf(i);

Answer 1

Не надо путать имя переменной с её значением. В качестве ключа используется значение, то есть строка, которую Вы присваиваете переменной("TextName7") - именно она и записывается в SharedPreferences.
То что Вы хотите должно выглядеть как-то так:

    public static final String KEY_PREFIX = "Name_";
       i = 1;
       String nameNumber = KEY_PREFIX + i;
       SharedPreferences.Editor editor = SFE.edit();
       editor.putString(nameNumber, "Привет мир"));
       editor.apply();
       Log.d("TAG_LOG", nameNumber);
       if (SFE.contains(nameNumber)) {
            Log.d("TAG_LOG", "Зашло");
       } else {
            Log.d("TAG_LOG", "Не зашло");
       }
Answer 2

Вы пытаетесь сложить строку с числом без явного приведения к строке. Попробуйте следующий вариант:

            public static final String Name_1 = "TextName7";
            private SharedPreferences SFE;
            @Override
                protected void onCreate(final Bundle savedInstanceState) 
                {
                    super.onCreate(savedInstanceState);
                    setContentView(R.layout.activity_main);
                                   ...
                    SharedPreferences.Editor editor = SFE.edit();
                    editor.putString(Name_1, "Привет мир"));
                    editor.apply();
                    String Name_number = "Name_" + "1";
                    if (SFE.contains(Name_number))
                    {
                        Log.d("TAG_LOG", "Зашло")
                    } else{
                        Log.d("TAG_LOG", "Не зашло")
                    }
                }

Здесь в строке

   String Name_number = "Name_" + "1";

Происходит сложение строк и получается корректная строка для сравнения

Answer 3

Вы проверяете существует ли у вас в настройках поле Name1. И правильно он вам выводит "не зашло", потому что у вас такого поля нет. Вы создаете поле, название которого определяете через переменную Name1, значение которой - TextName7. Сделайте проверку

if (SFE.contains(TextName7))

и у вас выведет "Зашло"

READ ALSO
Шифрование текста

Шифрование текста

Подскажите, есть ли лучшее решение для шифрования строки?

238
Что прописать в Gradle для push уведомлений?

Что прописать в Gradle для push уведомлений?

Хотел разобраться с push уведомлениямиНашел информацию, что нужно в builg

244
Передача данных из DialogFragment в Activity

Передача данных из DialogFragment в Activity

Появилась необходимость в текстовое окно установить датуметод showDialog(DIALOG_DATE) уже устарел

229