跨旋转保存数据似乎在我的android项目中不起作用

时间:2013-12-16 09:45:42

标签: java android rotation

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,就像我用来显示这个字符串/文本的方式一样。相反,我愚蠢地认为它会自动执行,因为该书没有添加此代码,我依赖它太多了。 这是一次很棒的学习经历,如果有人遇到这样的事情,如果答案不明确,请随时给我发电子邮件。

2 个答案:

答案 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)

试试这个:

android:configChanges="keyboard|keyboardHidden|orientation"

如上所述 here