Получение строки общих настроек в другом действии

Я пытаюсь сохранить несколько полей редактирования текста в одном действии, используя общие настройки, а затем вывести эти сохраненные значения в поля текстового просмотра в другом действии. Кажется, что данные сохраняются нормально в первом действии, но я не могу разрешить сохраненную переменную в новом действии. Кто-нибудь знает, что я делаю неправильно? Спасибо!

public class RelativeLayout extends AppCompatActivity {

EditText edit1;
EditText edit2;
EditText edit3;
public String Name = "nameKey";
public String Email = "emailKey";
public String Phone = "phoneKey";
public static final String MyPREFERENCES = "PrefStore" ;
SharedPreferences settings;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_relative_layout);
    final Button ButtonReturn = (Button) findViewById(R.id.button3);
    settings = getSharedPreferences(MyPREFERENCES, 0);
    //Onclick listen for return button press. On press App returns to main      activity.
    ButtonReturn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            edit1=(EditText)findViewById(R.id.editText);
            edit2=(EditText)findViewById(R.id.editText2);
            edit3=(EditText)findViewById(R.id.editText3);
            String n  = edit1.getText().toString();
            String e  = edit2.getText().toString();
            String p  = edit3.getText().toString();
            SharedPreferences.Editor editor = settings.edit();
            editor.putString(Name, n);
            editor.putString(Email, e);
            editor.putString(Phone, p);
            editor.apply();

Второе действие ниже. Я пытаюсь получить переменную Name в общих настройках, но она отображается красным цветом с ошибкой. Не удается разрешить символ «Имя».

public class MainActivity extends AppCompatActivity {

SharedPreferences settings;
public static final String MyPREFERENCES = "PrefStore" ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    final Button ButtonDCUWeb = (Button) findViewById(R.id.ButtonDCUWeb);
    final Button ButtonStartCamera = (Button) findViewById(R.id.ButtonStartCamera);
    final Button ButtonLinearLayout = (Button) findViewById(R.id.ButtonLinearLayout);
    final Button ButtonRelativeLayout = (Button) findViewById(R.id.ButtonRelativeLayout);
    settings = getSharedPreferences(MyPREFERENCES, MODE_PRIVATE);
    String value = settings.getString(Name, "Default_Value");

person MarcusRey    schedule 15.11.2015    source источник


Ответы (3)


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

1 - Объявите переменную Name во втором действии с тем же значением, что и первое. 2 - Сделайте переменную Name статической, чтобы вы могли получить к ней доступ во втором действии: public static String Name = "nameKey"; И во втором действии вы можете получить к нему доступ следующим образом:

String value = settings.getString(RelativeLayout.Name, "Default_Value"); 
person Mateus Brandao    schedule 15.11.2015

Вам также нужно объявить Name перед onCreate() во втором действии, чтобы иметь возможность ссылаться на него. Добавлять:

public String Name = "nameKey";
person Hussein El Feky    schedule 15.11.2015

в своем действии RelativeLayout поместите это в обратный вызов onClick:

public class RelativeLayout extends AppCompatActivity {
    ...
    ...
    public static String Name = "nameKey";
    public static String Email = "emailKey";
    public static String Phone = "phoneKey";

    ...
    ...

    SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putString(Name, n);
    editor.putString(Email, e);
    editor.putString(Phone, p);
    editor.apply();
}

MainActivity.java:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ...
    ...

    SharedPreferences sharedPreferences = getPreferences(Context.MODE_PRIVATE);
    String nameValue = sharedPreferences.getString(RelativeLayout.Name, "Default_Name_Value");
    String emailValue = sharedPreferences.getString(RelativeLayout.Email, "Default_Email_Value");
    String phoneValue = sharedPreferences.getString(RelativeLayout.Phone, "Default_Phone_Value");
    // Do something with the values you retrieve
}

Вам не нужно хранить ссылку на ваш sharedPreferences в ваших действиях во время процесса.

person Mohammed Aouf Zouag    schedule 15.11.2015
comment
К сведению - он не сможет получить RelativeLayout.Email и другие из RelativeLayout класса, если эти поля не static... - person Damian Kozlak; 15.11.2015