Сохранение строк с помощью SharedPreferences

271
11 июля 2017, 19:54

Есть текстовое поле которое при первом запуске пусто и пользователь вбивает в него имя. При повторном запуске в поле имя уже должно отражаться. Использую SharedPreferences для сохранения. код :

public class MainMenu extends AppCompatActivity
{
Button saveBTB;
public  static  final  String APP_PREFERENCES  = "mySettings";
public static final String APP_PREFERENCES_NAME = "Name";
SharedPreferences App_Settings;
EditText etN;
EditText etF;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main_menu);
    if (App_Settings.contains(APP_PREFERENCES_NAME))
    {
        etN = (EditText) findViewById(R.id.editText7);
        etN.setText(App_Settings.getString(APP_PREFERENCES_NAME,""));
    }
    saveBTB = (Button) findViewById(R.id.saveBTB);
    saveBTB.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v) {
            etN = (EditText) findViewById(R.id.editText7);
            String NameProfil = etN.getText().toString();
            App_Settings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
            editor = App_Settings.edit();
            editor.putString(APP_PREFERENCES_NAME, NameProfil);
            editor.apply();
        }
    });
} }

Проект вылетает на if. Без этого условия все вроде работает. В чем ошибка в этом коде ? Тестирую через BlueStack.

Answer 1

Объект App_Setting инициализуертся у вас в методе onClick(). Когда вы обращаетесь к нему в методе onCreate(), он не инициализирован - объект пустой и сравнивать там нечего и не с чем. Данному вопросу посвящены разделы документации и литературы о областях видимости переменных и о полях класса.

public class MainMenu extends AppCompatActivity {
    public  static  final  String APP_PREFERENCES  = "mySettings";
    public static final String APP_PREFERENCES_NAME = "Name";
    private final SharedPreferences appSettings;
    private final EditText etN;
    private final EditText etF;
    private final Button saveBTB;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_menu);
        appSettings = getSharedPreferences(APP_PREFERENCES, Context.MODE_PRIVATE);
        etN = (EditText) findViewById(R.id.editText7);
        saveBTB = (Button) findViewById(R.id.saveBTB);
        if (appSettings.contains(APP_PREFERENCES_NAME)) {            
            etN.setText(appSettings.getString(APP_PREFERENCES_NAME,""));
            }
        saveBTB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String NameProfil = etN.getText().toString();
                Editor editor = appSettings.edit();
                editor.putString(APP_PREFERENCES_NAME, NameProfil);
                editor.apply();
            }
        });
    }
}

Исправлено несколько логических ошибок. В частности, не нужно получать ссылку на виджет каждый раз при обращении, это довольно дорогая операция, которая ничего нового при опросе после каждого клика не сообщит. Ссылки на виджеты получают один раз, в начале метода onCreate() и в дальнейшем используют сохраненную в поле класса ссылку.
Так же неплохо ознакомится с конвенцией оформления кода в Java, в частности имена экземпляров классов пишутся в lowerCamalCase-стиле, без всяких прочерков, это может показаться незначительным, но читать подобную самодеятельность больно для глаз и если показываете код кому то, то уж придерживайтесь конвенции. Сами имена переменным, полям класса, методам и собственно классам принято давать осмысленные, отражающие суть скрывающегося за ним, все эти etN вас самого начнут сильно утомлять, когда проект примет сколько-нибудь существенный объем.

READ ALSO
В чем разница между URL Rewriting, encodeURL, encodeRedirectUrl

В чем разница между URL Rewriting, encodeURL, encodeRedirectUrl

URL Rewriting как я понял нужен для поддержания сессии в случае если в браузере отключены куки (Поправьте пожалуйста, если я не прав)

206
Spring Integration Dynamic Outbound mapping

Spring Integration Dynamic Outbound mapping

Добрый день, мне необходимо спроксировать доступ к api с помощью spirng integrationСконфигурировал inboundGateway и outboundGateway

196
Ошибка с преобразованием строки в число

Ошибка с преобразованием строки в число

Выводит ошибку NumberFormatException:

351
java robot.mousePress(InputEvent.BUTTON3_MASK); не нажимается правая кнопка

java robot.mousePress(InputEvent.BUTTON3_MASK); не нажимается правая кнопка

Такая проблема, не знаю в чем сольДля теста, в программе надо сделать имитацию нажатия правой кнопки мыши, чтобы перейти в определенную форму

223