再会。遇到这样的问题(我在Android. Programming for Professionals. 3rd edition - 卡在第5章的最后一个任务上练习):下面是一个允许用户窥视一个简单问题的正确答案的类。查看提示后,当返回问题并点击正确答案时,用户会看到“作弊不好”的字样。问题是在这个类中你需要保存结果——用户是否窥探到答案,这样当手机屏幕翻转时,这个指示器不会被重置。我不明白该怎么做。究竟需要保存什么?我试图在代码位置替换值 mAnswerIsTrue -> (________) - 但这并没有给出预期的结果。我认为您需要保存 wasAnswerShown 方法的结果,但这只是一个假设。
public class CheatActivity extends AppCompatActivity {
//константа TAG (источник сообщения) = "имя класса"
public static final String TAG = "CheatActivity";
//ключ для дополнения-интента который CheatActivity читает и использует (в методе newIntent)
private static final String EXTRA_ANSWER_IS_TRUE = "com.bignerdranch.android.geoquiz.answer_is_true";
//ключ дополнения для назначения результата
private static final String EXTRA_ANSWER_SHOWN = "com.bignerdranch.android.geoquiz.answer_shown";
private boolean mAnswerIsTrue;
private TextView mAnswerTextView;
private Button mShowAnswerButton;
//инкапсулированный метод для включения дополнения в интент
//он позволяет создать объект Intent, настроенный дополнениями, необходимыми для CheatActivity
// boolean answerIsTrue - выступает значением в дополнении
// (включение дополнения в интент - интент.дополнение(ключ,значение))
public static Intent newIntent (Context packageContext, boolean answerIsTrue){
Intent intent = new Intent(packageContext, CheatActivity.class);
//далее интент.дополнение (ключ, значение)
intent.putExtra(EXTRA_ANSWER_IS_TRUE, answerIsTrue);
return intent;
}
//декодирование интента результата (из метода setAnswerShownResult)
public static boolean wasAnswerShown (Intent result){
return result.getBooleanExtra(EXTRA_ANSWER_SHOWN,false);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate(Bundle) called");// <- эта строка регистрирует сообщение (Log.d),
// ^(источник сообщения,"какое сообщение вывести")
setContentView(R.layout.activity_cheat);
if (savedInstanceState != null){
___________ = savedInstanceState.getBoolean(EXTRA_ANSWER_SHOWN, ___________);
}
// метод для чтения значения из дополнения + сохранение значения в переменной mAnswerIsTrue
mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false);
mAnswerTextView = (TextView) findViewById(R.id.answer_text_view);
mShowAnswerButton = (Button) findViewById(R.id.show_answer_button);
//далее когда нажимаем на "Show Answer" - показать текст правильного ответа
mShowAnswerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mAnswerIsTrue) {
mAnswerTextView.setText(R.string.true_button);
}
else {
mAnswerTextView.setText(R.string.false_button);
}
setAnswerShownResult(true);
}
});
}
private void setAnswerShownResult (boolean isAnswerShown) {
Intent data = new Intent();
data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown);
setResult(RESULT_OK, data);
}
@Override
public void onSaveInstanceState(Bundle saveInstanceState) {
super.onSaveInstanceState(saveInstanceState);
Log.d(TAG, "onSaveInstanceState");
saveInstanceState.putBoolean(EXTRA_ANSWER_SHOWN,__________);
}
1)首先你需要声明一个变量
private boolean mWasAnswerShown2)在onCreate方法中,需要这样获取保存的值:
3) 并在 onSaveInstanceState 方法中,以这种方式保存 mWasAnswerShown 变量的值:
PS如果你从那个有问题的活动中启动CheatActivity并且你需要CheatActivity的一些结果,那么你也可以在你的有问题的活动中使用start CheatActivity来等待结果:
在 CheatActivity 代码中,将必要的数据放入 Intent 中:
当从带有问题的活动代码中的 CheatActivity 返回时,您将可以通过以下方法访问此意图,您将数据放入其中:
当屏幕旋转时,再次调用 onCreate 方法。在我看来,您可以覆盖 onStop 或 onPause 方法并将状态存储在其中。并且在onCreate方法中,检查保存的状态是否为空,如果不是,将其拉出。