java - 在我的 Android 项目中,跨旋转保存数据似乎不起作用

标签 java android rotation

请注意:我的问题的解决方案在底部以粗体文本显示。我接受了梅尔基亚德斯的回答,因为他帮助我过滤掉了所有可能出现问题的内容。事实证明,我才是问题所在,而不是 Android 或其他任何东西。因此,如果您正在寻找答案,请阅读下文。

我正在尝试保存变量在 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);
}

但这不起作用。 每当 Activity 被销毁和创建时,myIntVariable 就会重置为 0。

我解决这个问题的方法是转到我的 list 文件并 添加了 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()");
    }

出于所有 Intent 和目的,变量mIndexCounter 是我提到的“myIntVariable”。

解决方案: 我正在使用一本书,不幸的是,由于我是 Android 编程新手,所以过于依赖书中编写的代码。作者通常会在书中以粗体、黑色文本的形式添加新代码。这次,他们没有做到这一点,我很难弄清楚为什么我的数据没有被保存。事实证明它一直保存着,只是每次检索时都无法使用保存的数据更新 View 。添加 3 行简单代码后,我的错误就很明显了,我一直试图实现的目标成功了。 我的程序显示了一个依赖于用于从 R.java 类检索信息的 int 的文本字符串。启动应用程序后,当用户按“下一步”时,数据会发生变化,因为 int 会递增并且 View 上的 String 会发生变化。 由于 Android 的性质会在方向改变时销毁任何未保存的数据,因此要保存此数据。 我所要做的就是简单地添加保存的数据(一个 int),就像我最初显示此字符串/文本的方式一样。相反,我愚蠢地认为它会自动完成,因为这本书没有添加这段代码,而且我太依赖它了。 这是一次很棒的学习经历,如果有人遇到过类似的事情,如果我的答案不清楚,请随时给我发电子邮件。

最佳答案

不要在 onCreate() 中,而是在 onRestoreInstanceState() 中恢复变量:

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);

    myIntVariable = savedIntanceState.getInt(KEY_INDEX, 0);
}

docs还说:

Note: Because onSaveInstanceState() is not guaranteed to be called, you should use it only to record the transient state of the activity (the state of the UI)—you should never use it to store persistent data. Instead, you should use onPause() to store persistent data (such as data that should be saved to a database) when the user leaves the activity.

顺便说一句,将您的 onCreate() 签名更改为:

@Override
protected void onCreate(Bundle savedInstanceState) {

如文档中所示。

关于java - 在我的 Android 项目中,跨旋转保存数据似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20607674/

相关文章:

android - 数据库未显示在 ListView 中,仅显示图像

javascript - ThreeJS轨迹球控制相机旋转

java - 在 Intellij Ultimate 中为简单的 Spring 应用程序设置 applicationContext.xml

java - 如何鼠标悬停然后需要单击选项卡-Selenium WebDriver

android - 如何解决 android api 26 中的录制声音问题

Android Compass 在不同的手机上读取不同的值?

html - 在表中旋转标题时出现格式错误

javascript - 我将如何在 Canvas 上旋转图像以面向其运动方向?

客户端的 java 客户端-服务器问题(无 System.out)

java - 使用 Junit 测试 Runnable 方法,for 循环内部的逻辑意外地只执行一次