PLESAE注意:我的问题的解决方案在底部以粗体显示。我接受了Melquiades的回答,因为他帮助我过滤掉了可能出现问题的一切。事实证明,我是问题,而不是机器人或其他任何东西。因此,如果您正在寻找答案,请阅读以下内容。
我试图保存变量的状态,因为onPause();
,onStop();
,onDestroy();
被调用。
我正在使用的这本书覆盖了一个名为
的方法public void onSaveInstanceState(Bundle savedInstanceState){
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt(KEY_INDEX, myIntVaraible);
}
您在参数中看到的变量是在类的开头声明的
private static final String KEY_INDEX = "index";
private int myIntVariable;
创建此方法后,本书告诉我然后转到onCreate
方法并添加
if(savedInstanceState != null){
myIntVariable = savedIntanceState.getInt(KEY_INDEX, 0);
}
但这不起作用。
每当销毁和创建活动时,myIntVariable
将重置为0.
我做了什么来解决这个问题,我去了我的清单文件
添加了android:configChanges="orientation|screenSize"
。
但是,我已经读到这是不实际的,强烈建议不要这样做。
编辑:根据建议,我正在添加onCreate();
和onResume();
方法..
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate()");
setContentView(R.layout.activity_main);
iterateQuestions();
mTrueButton = (Button)findViewById(R.id.trueBt);
mTrueButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
correctPressed = true;
checkForTrue();
}
});
mFalseButton = (Button)findViewById(R.id.falseBt);
mFalseButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
falsePressed = false;
checkForFalse();
}
});
mNextButton = (ImageButton)findViewById(R.id.nextBt);
mNextButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
try{
mIndexCounter++;
mTextViewQuestion = (TextView)findViewById(R.id.text_question_view);
int QuestionToShow = mQuestionBank[mIndexCounter].getQuestion();
mTextViewQuestion.setText(QuestionToShow);
}
catch(Exception e){
iterateQuestions();
}
}
});
mTextViewQuestion = (TextView)findViewById(R.id.text_question_view);
mTextViewQuestion.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
try{
mIndexCounter++;
mTextViewQuestion = (TextView)findViewById(R.id.text_question_view);
int QuestionToShow = mQuestionBank[mIndexCounter].getQuestion();
mTextViewQuestion.setText(QuestionToShow);
}
catch(Exception e){
iterateQuestions();
}
}
});
mPrevButton = (ImageButton)findViewById(R.id.prevBtn);
mPrevButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v){
try{
mIndexCounter--;
mTextViewQuestion = (TextView)findViewById(R.id.text_question_view);
int QuestionToShow = mQuestionBank[mIndexCounter].getQuestion();
mTextViewQuestion.setText(QuestionToShow);
}catch(Exception e){
iterateQuestionsReverse();
}
}
});
}
和
@Override
public void onResume(){
super.onResume();
Log.d(TAG,"onResume()");
}
对于所有意图和目的,变量mIndexCounter
是" myIntVariable"我提到。
解决方案: 我正在使用一本书,不幸的是,因为我是Android编程新手,所以过分依赖本书中的代码。作者通常在他们的书中添加新的代码作为粗体黑色文本。这一次,他们没有做到这一点,我无法弄清楚为什么我的数据没有被保存。事实证明它一直保存,我只是无法在检索时使用保存的数据更新视图。在添加了3行简单代码之后,我的错误是显而易见的,并且我一直在努力实现目标,成功。
我的程序显示了一串文本,该文本依赖于用于从R.java类检索信息的int
。启动应用程序后,当用户按下Next时,数据会更改,因为int会递增并且视图上的String会更改。
由于Android在性质改变时销毁任何未保存数据的性质,因此保存了这些数据。
我所要做的只是添加保存的数据,一个int,就像我用来显示这个字符串/文本的方式一样。相反,我愚蠢地认为它会自动执行,因为该书没有添加此代码,我依赖它太多了。
这是一次很棒的学习经历,如果有人遇到这样的事情,如果答案不明确,请随时给我发电子邮件。
答案 0 :(得分:1)
而不是onCreate(),在onRestoreInstanceState()中恢复你的变量:
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
myIntVariable = savedIntanceState.getInt(KEY_INDEX, 0);
}
docs也说:
注意:因为无法保证调用onSaveInstanceState(),所以您应该仅使用它来记录活动的瞬态(UI的状态) - 您永远不应该使用它来存储持久数据。相反,当用户离开活动时,您应该使用onPause()来存储持久数据(例如应该保存到数据库的数据)。
顺便说一下,将你的onCreate()签名改为:
@Override
protected void onCreate(Bundle savedInstanceState) {
在文档中。
答案 1 :(得分:0)