2016-05-23 1 views
0

Я программирую простое приложение с двумя действиями. Я могу переключиться на Activity, нажав на элемент в OptionMenu.Как сохранить строки?

Теперь я хочу сохранить экземпляр. Когда я пишу что-то в EditText в Activity 1 и переключаюсь на Activity 2, а затем снова переключаюсь на Activity 1, я хочу, чтобы данные (String) были восстановлены в EditText.

Как это сделать?

Это код для деятельности 1:

public class ActivityA extends Activity { 

private String txt1; 
private String txt2; 
private String txt3; 
private String txt4; 

private EditText edText1; 
private EditText edText2; 
private EditText edText3; 
private EditText edText4; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_a); 
    setTitle(R.string.activity1_title); 

    txt1 = "-"; 
    txt2 = "-"; 
    txt3 = "-"; 
    txt4 = "-"; 

    if (savedInstanceState != null){ 
     txt1 = savedInstanceState.getString("Value1"); 
     txt2 = savedInstanceState.getString("Value2"); 
     txt3 = savedInstanceState.getString("Value3"); 
     txt4 = savedInstanceState.getString("Value4"); 
    } 

    edText1 = (EditText) findViewById(R.id.editText); 
    edText1.setText(""+txt1); 

    edText2 = (EditText) findViewById(R.id.editText2); 
    edText2.setText(""+txt2); 

    edText3 = (EditText) findViewById(R.id.editText3); 
    edText3.setText(""+txt3); 

    edText4 = (EditText) findViewById(R.id.editText4); 
    edText4.setText(""+txt4); 
} 

public void onSaveInstanceState(Bundle savedInstanceState) { 
    super.onSaveInstanceState(savedInstanceState); 
    savedInstanceState.putString("Value1",txt1); 
    savedInstanceState.putString("Value2",txt2); 
    savedInstanceState.putString("Value3",txt3); 
    savedInstanceState.putString("Value4",txt4); 

} 

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    txt1 = savedInstanceState.getString("Value1"); 
    txt2 = savedInstanceState.getString("Value2"); 
    txt3 = savedInstanceState.getString("Value3"); 
    txt4 = savedInstanceState.getString("Value4"); 

} 
} 

Проблема заключается в том, что она не сохраняет строки, и я не знаю, почему.
У кого-нибудь есть идея?

+0

http://www.tutorialspoint.com/android/android_shared_preferences.htm –

+0

эта идея может быть глупой - напишите в файл, чтобы сохранить строку. –

ответ

1

супер вызов super.onSaveInstanceState(savedInstanceState); должен быть вызван после заявлений нанесенными

public void onSaveInstanceState(Bundle savedInstanceState) { 

    savedInstanceState.putString("Value1",edText1.getText().toString()); 
    savedInstanceState.putString("Value2",edText2.getText().toString()); 
    savedInstanceState.putString("Value3",edText3.getText().toString()); 
    savedInstanceState.putString("Value4",edText4.getText().toString()); 
    super.onSaveInstanceState(savedInstanceState); 
} 


public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); 
    txt1 = savedInstanceState.getString("Value1"); 
    edText1.setText(""+txt1); 
    .... 

} 

Сложение:

Это также довольно хорошо использовать конечные переменные для Bundle Кис. (возможно, статический)

+0

Все еще не работает для меня ..:/ –

+0

Я обновил свой ответ. txt1 - «-», потому что вы не обновляете это значение. получить текст из editView – FlanschiFox

+0

Я сделал это .. но он все равно не работает! :/ –

1

Общие предпочтения - это путь для хранения и извлечения простых данных. Храните его, когда вы покидаете первое действие, и восстанавливайте его в onCreate, когда пользователь возвращается к активности.

0

Вы были почти правы. Просто измените место вашего супер-звонка, и оно должно решить вашу проблему.

public void onSaveInstanceState(Bundle savedInstanceState) { 
    savedInstanceState.putString("Value1",txt1); 
    savedInstanceState.putString("Value2",txt2); 
    savedInstanceState.putString("Value3",txt3); 
    savedInstanceState.putString("Value4",txt4); 
    super.onSaveInstanceState(savedInstanceState); // Call at the end 
} 

public void onRestoreInstanceState(Bundle savedInstanceState) { 
    super.onRestoreInstanceState(savedInstanceState); // Call at the beginning 
    txt1 = savedInstanceState.getString("Value1"); 
    txt2 = savedInstanceState.getString("Value2"); 
    txt3 = savedInstanceState.getString("Value3"); 
    txt4 = savedInstanceState.getString("Value4"); 
} 
+0

'super.onRestoreInstanceState (savedInstanceState);' Должно быть вызвано первым, чтобы суперкласс сначала получил пакет. Таким образом, вы убедитесь, что ребенок не испортил никого. – FlanschiFox

+0

Да, вы правы. Я уточню свой ответ. – perbellinio

+0

Все еще не работает для меня ..: / –

0

На основе кода, я не думаю, что ваша onRestoreInstanceState функция будет вызываться, если вы только что вернулись из второй активности. Вместо этого я рекомендовал бы использовать Shared Preferences.

Поскольку onRestoreInstanceState будет вызываться только если:

  1. Вы savedInstanceState
  2. Ваша деятельность была убита системой, и теперь ему нужно воссоздать его.

Плюс, вам необходимо позвонить в службу поддержки super.onSaveInstanceState() после того, как вы поместите все сбережения в комплект.

Смежные вопросы