Сохранение результата методом onSaveInstanceState

SQLite, Preferences, файлы, SD, Content Provider, XML, JSON
Ответить
iandryxa
Сообщения: 58
Зарегистрирован: 23 янв 2014, 20:40

Сохранение результата методом onSaveInstanceState

Сообщение iandryxa » 14 апр 2014, 21:11

Всем доброго времени суток! Ребят возникла такая проблема, как при помощи метода onSaveInstanceState сохранить возвращаемые из одного Activity изначальный данные?
То есть у меня есть две активности в одном задаются вопросы во втором можно подсмотреть ответ, но по возвращению в исходную активность при правильном ответе выводится сообщение о подсмотренном ответе, так вот проблема состоит в том что при повороте устройства сбрасывается значение ключа передаваемое через интент из активити с подсказкой.
Так вот как его сохранить?

Само приложение http://yadi.sk/d/BN-4TYIyMSvTU

Код MainActivity и CheatActivity:
MA

Код: Выделить всё

package com.example1.geoquizn;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
	
	private final static String TAG = "MainActivity";
	
	private final static String KEY_INDEX = "index";
	
	private final static String KEY_INDEX_ONE = "index_one";
	
	private Button mTrueButton;
	private Button mFalseButton;
	private TextView mQuestionTextView;
	private ImageButton mNextImageButton;
	private ImageButton mLastImageButton;
	private Button mBtnCheat;
	
	private TrueFalse[] mQuestionBank = new TrueFalse[]{
		new TrueFalse(R.string.question1, true),
		new TrueFalse(R.string.question2, false),
		new TrueFalse(R.string.question3, false),
		new TrueFalse(R.string.question4, true),
		new TrueFalse(R.string.question5, true),
		new TrueFalse(R.string.question6, false),
	};
	
	private int mCurrentIndex = 0;
	
	private boolean mIsCheater; //переменная для хранения значения вохвращаемого CheatActivity
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode,Intent data){
		if(data == null){
			return;
		}
		mIsCheater = data.getBooleanExtra(CheatActivity.EXTRA_ANSWER_SHOW, true);
	}
	private void updateQuestion(){
		int question = mQuestionBank[mCurrentIndex].getQuestion();
		mQuestionTextView.setText(question);
	}
	private void  checkAnswer(boolean userPressedTrue){
		boolean answerIsTrue = mQuestionBank[mCurrentIndex].isTrueQuestion();
		int messangeResId = 0;
		if(mIsCheater){
			messangeResId = R.string.spy;
		}else{
		if(userPressedTrue == answerIsTrue){
			messangeResId = R.string.text_c;
		}else{
			messangeResId = R.string.text_inc;
		}
		}
		Toast.makeText(this, messangeResId, Toast.LENGTH_SHORT).show();
		}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		
		mQuestionTextView = (TextView)findViewById(R.id.tvMain);
		mQuestionTextView.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				mCurrentIndex = (mCurrentIndex + 1)% mQuestionBank.length;
				updateQuestion();
			}
		});
		
		
		mTrueButton = (Button)findViewById(R.id.btnT);
		mTrueButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				checkAnswer(true);
			}
		});
		mFalseButton = (Button)findViewById(R.id.btnF);
		mFalseButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				checkAnswer(false);
			}
		});
		mNextImageButton = (ImageButton) findViewById(R.id.btnN);
		mNextImageButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				
				mCurrentIndex = (mCurrentIndex + 1)% mQuestionBank.length;
				updateQuestion();
			}
		});
		
		
		mLastImageButton = (ImageButton)findViewById(R.id.btnL);
		mLastImageButton.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				mCurrentIndex = (mCurrentIndex - 1)% mQuestionBank.length;
				updateQuestion();
			}
		});
		mBtnCheat = (Button)findViewById(R.id.btnCheat);
		mBtnCheat.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				//здесь будет происходить запуск активности
				Intent i = new Intent(MainActivity.this, CheatActivity.class);//объект типа class задает компонент
				//который должен быть
				//запущен из MainActivity
				boolean answerIsTrue = mQuestionBank[mCurrentIndex].isTrueQuestion();//передача дополнения из MainActivity в CheatActivity 
				i.putExtra(CheatActivity.EXTRA_ANSWER_IS_TRUE, answerIsTrue);
				startActivityForResult(i, 0);//используем для получения результата от дочерней активности
			}
		});
		
		
		if(savedInstanceState != null){
			mCurrentIndex = savedInstanceState.getInt(KEY_INDEX, 0);
		}
		updateQuestion();
		
	}

	public void onSaveInstanceState(Bundle savedInstanceState){
		super.onSaveInstanceState(savedInstanceState);
		Log.i(TAG, "onSaveInstanceState");
		savedInstanceState.putInt(KEY_INDEX, mCurrentIndex);
	}
	
	@Override
	public void onStart(){
		super.onStart();
		Log.d(TAG, "onStart() called");
	}
	
	@Override
	public void onPause(){
		super.onPause();
		Log.d(TAG, "onPause() called");
	}
	
	@Override
	public void onResume(){
		super.onResume();
		Log.d(TAG, "onResume() called");
	}
	
	@Override
	public void onStop(){
		super.onStop();
		Log.d(TAG, "onStop() called");
	}
	
	@Override
	public void onDestroy(){
		super.onDestroy();
		Log.d(TAG, "onDestroy() called");
	}

}
CA

Код: Выделить всё

package com.example1.geoquizn;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class CheatActivity extends Activity {
	
	private boolean mAnswerIsTrue;
	private TextView mTvAnswer;
	private Button mBtnAnswer;
	public final static String EXTRA_ANSWER_IS_TRUE = 
			"com.example1.android.geoquizn.answer_is_true";//является ключем для чтение дополнения из MainActivity
	
	public static final String EXTRA_ANSWER_SHOW = //является ключем для хранения информации была ли нажата кнопка "подсмотреть"
			"com.example1.android.geoquizn.answer_show";
	
	private void setAnswerShownResult(boolean isAnswerShow){//закрытый метод, создающий интент, помещющий в него дополнение
															//и назначение кода результата
		Intent data = new Intent();data.putExtra(EXTRA_ANSWER_SHOW, isAnswerShow);
		setResult(RESULT_OK, data);
	}
	
	private final static String KEY_INDEX = "index";
	
	@Override
	public void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_cheat);
		setAnswerShownResult(false);
		mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);//используем для чтения дополнения 
		
		mTvAnswer = (TextView)findViewById(R.id.tvMain2);
		String text ="";
		
		mBtnAnswer = (Button) findViewById(R.id.btnAnswer);
		mBtnAnswer.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				if(mAnswerIsTrue){
					mTvAnswer.setText(R.string.btnT_text);
				}else{
					mTvAnswer.setText(R.string.btnF_text);
				}
				setAnswerShownResult(true);
			}
		});
		if(savedInstanceState != null && savedInstanceState.containsKey(KEY_INDEX)){
			text = savedInstanceState.getString(KEY_INDEX);
			mTvAnswer.setText(text);
		}
	
		}
	public void onSaveInstanceState(Bundle savedInstanceState){
		//получим ссылку на текстовую переменную 
		TextView mTvAnswer = (TextView)findViewById(R.id.tvMain2);
		//сохраняем его состояние
		savedInstanceState.putString(KEY_INDEX,mTvAnswer.getText().toString());
		//вызываем суперкласс для сохранения состояния видов 
		super.onSaveInstanceState(savedInstanceState);
	}

}


Аватара пользователя
n0tb0dy
Сообщения: 135
Зарегистрирован: 14 фев 2014, 09:42

Re: Сохранение результата методом onSaveInstanceState

Сообщение n0tb0dy » 15 апр 2014, 19:33

то есть вы сперва поворачиваете экран, а потом возвращаетесь в главную активность из активности с подсказкой?

если это так, то все происходит правильно, так как при повороте экрана активность уничтожается и создается заново, это во первых,

во вторых в коде активности с подсказками я не увидел метода onRestoreInstanceState

то есть вы сохраняете данные, но не достаете из из Bundle, то есть не восстанавливаете их

Ответить