2017-02-28 1 views
-1

저는 안드로이드를 처음 접했고 화면이 회전 할 때 부울 값을 저장하려고합니다. 기본적으로 내 문제는 현재입니다 : 사용자가 주 활동에서 "치트"버튼을 누르면 그는 새로운 활동으로 리디렉션됩니다 거기에 그가 클릭 할 때 "대답 표시"버튼이 있습니다. 부울 변수 mIsCheater는 true로 설정되지만 화면이 회전하면 값은 false가됩니다.안드로이드는 로테이션에서 값을 저장합니다

package com.example.macbookair.androidbooktutorials; 

import android.content.Intent; 
import android.os.PersistableBundle; 
import android.support.v7.app.AppCompatActivity; 
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; 

import com.example.macbookair.androidbooktutorials.Models.TrueFalse; 

public class MainActivity extends AppCompatActivity { 

    private static final String KEY_INDEX = "index"; 
    private static final String BOOLEAN_INDEX = "index"; 

    private Button mTrueButton,mFalseButton,mCheatButton; 
    private ImageButton mNextButton; 
    private ImageButton mPrevButton; 
    private TextView mQuestionTextView; 
    private int mCurrentIndex = 0; 
    private boolean mIsCheater; 

    private TrueFalse[] mQuestionBank = new TrueFalse[] { 
      new TrueFalse(R.string.question_africa,false), 
      new TrueFalse(R.string.question_oceans,true), 
      new TrueFalse(R.string.question_mideast,false), 
      new TrueFalse(R.string.question_africa,true), 
      new TrueFalse(R.string.question_asia,true) 
    }; 





    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mCheatButton = (Button) findViewById(R.id.cheat_button); 

     if(savedInstanceState != null) { 
      mCurrentIndex = savedInstanceState.getInt(KEY_INDEX,0); 
      boolean theValue = savedInstanceState.getBoolean(BOOLEAN_INDEX); 
      Log.d("Is that true? -> ", mIsCheater + " "); 
     } 


     mTrueButton = (Button) findViewById(R.id.true_button); 
     mFalseButton = (Button) findViewById(R.id.false_button); 


     mQuestionTextView = (TextView) findViewById(R.id.question_text_view); 



     mNextButton = (ImageButton) findViewById(R.id.button_next); 
     mPrevButton = (ImageButton) findViewById(R.id.button_prev); 

     updateQuestion(); 

     mCheatButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this, CheatActivity.class); 
       boolean answerIsTrue = mQuestionBank[mCurrentIndex].isTrueQuestion(); 
       i.putExtra(CheatActivity.EXTRA_ANSWER_IS_TRUE,answerIsTrue); 
//    startActivity(i); 
       startActivityForResult(i,0); 
      } 
     }); 

     mPrevButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (mCurrentIndex > 0) { 
        mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length; 
        updateQuestion(); 
       } else { 
        Toast.makeText(MainActivity.this,R.string.message,Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

     mQuestionTextView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mCurrentIndex = (mCurrentIndex +1) % mQuestionBank.length; 
       updateQuestion(); 
      } 
     }); 

     mNextButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mCurrentIndex = (mCurrentIndex +1) % mQuestionBank.length; 
       mIsCheater = false; 
       updateQuestion(); 
      } 
     }); 

     mTrueButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       checkedAnswer(true); 
      } 
     }); 

     mFalseButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       checkedAnswer(false); 
      } 
     }); 
    } 

    private void updateQuestion() { 
     int question = mQuestionBank[mCurrentIndex].getmQuestion(); 
     mQuestionTextView.setText(question); 
    } 

    private void checkedAnswer(boolean isTrue) { 
     boolean answer = mQuestionBank[mCurrentIndex].isTrueQuestion(); 

     int messageId = 0; 

     if(mIsCheater) { 
      messageId = R.string.judgment_toast; 
     } 

     if(isTrue == answer) { 
      messageId = R.string.correct_toast; 
     } else { 
      messageId = R.string.incorrect_toast; 
     } 
     Toast.makeText(this,messageId,Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putInt(KEY_INDEX,mCurrentIndex); 
     outState.putBoolean(BOOLEAN_INDEX, mIsCheater); 
     Log.d("What value is there? ->", mIsCheater + " "); 

    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if(data == null) { 
      return; 
     } 
     mIsCheater = data.getBooleanExtra(CheatActivity.EXTRA_ANSWER_SHOWN,false); 
    } 
} 

그리고 단지의 경우에 두 번째 활동에서 코드 : 여기

코드, 당신은 회전 할 때이

mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false); 

을 가지고 있지만

package com.example.macbookair.androidbooktutorials; 

import android.content.Intent; 
import android.os.PersistableBundle; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class CheatActivity extends AppCompatActivity { 

    private boolean mAnswerIsTrue; 
    private TextView mAnswerTextView; 
    private Button mShowAnswer; 


    public static final String EXTRA_ANSWER_IS_TRUE = "com.example.macbookair.androidbooktutorials.answer_is_true"; 
    public static final String EXTRA_ANSWER_SHOWN = "com.example.macbookair.androidbooktutorials.answer_is_showed"; 
    public static final String INDEX = "cheatIndex"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.cheat_activity); 

     mAnswerTextView = (TextView) findViewById(R.id.answerTextView); 
     if(savedInstanceState != null) { 
      String text = savedInstanceState.getString(INDEX,mAnswerTextView.toString()); 
      mAnswerTextView.setText(text); 
     } 

     mAnswerIsTrue = getIntent().getBooleanExtra(EXTRA_ANSWER_IS_TRUE, false); 

     mShowAnswer = (Button) findViewById(R.id.showAnswerButton); 

     setAnswerShownResult(false); 

     mShowAnswer.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); 
      } 
     }); 



    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     outState.putString(INDEX, mAnswerTextView.getText().toString()); 

    } 


    private void setAnswerShownResult(boolean isAnswerShown) { 
     Intent data = new Intent(); 
     data.putExtra(EXTRA_ANSWER_SHOWN, isAnswerShown); 
     setResult(RESULT_OK, data); 
    } 


} 
+0

하기 전에 데이터를 put한다 오리엔테이션 변경이 감지되었습니다 ... – csmckelvey

+0

'super.onSaveInstanceState (outState); 앞에 데이터를 넣어야합니다. –

+0

@ cricket_007 예, 고쳐주었습니다. 고마워요. –

답변

0

I 돈 의도적으로 그렇게하지 않으면 의도 데이터가 저장된다고 생각하지 않습니다. 내가 정확히 기억한다면 그 화재 때 이벤트가있는 경우

당신은 또한 onSaveInstanceStatemAnswerIsTrue을 저장하고 또한 onCreate 또는 onRestoreInstanceState

내에서 검색 할 필요가, 당신은 궁금 super.onSaveInstanceState(outState);

관련 문제