2016-10-23 10 views
0

私のアプリのレイアウトにはTextViewとトグルボタンが含まれています。トグルボタンがオンになるとAlertDialogが表示され、カウントダウンの開始時刻を入力するようユーザーに求められます。カウントダウン中に向きを変えないとうまくいきます。しかし、カウントダウンが継続している間に向きを変えると、ダイアログボックスが再表示されます。私はオリエンテーションを変えることで私の活動が破壊されて再現されることを知っています。トグルボタンがオンになっていて、アクティビティが再作成されると破壊される前にオンになっていなければなりません。だから私の質問は、AlertDialogが方向変更後に表示されないようにする方法がある場合です。カウントダウンタイマーアプリにオリエンテーションを変更すると問題が発生する

私は次を追加しようとしているが、それは がクラスとして宣言された変数

それは

を破壊される前の状態を保存し、真

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Log.d(TAG, "onCreate: created............."); 
     mTextTime = (TextView) findViewById(R.id.textView); 
     mToggleButton = (ToggleButton) findViewById(R.id.toggleButton); 
     if((savedInstanceState != null) && TOGGLE_BUTTON_STATE.equals("ON")) { 
      Log.d(TAG, "onCreate: created after changing orientation........"); 
      mToggleButton.setChecked(true); 
     } 
     mToggleButton.setOnCheckedChangeListener(this); 

にトグルボタンを設定しようと

public static final String TOGGLE_BUTTON_STATE = "OFF"; 

仕事didntは

@Override 
public void onSaveInstanceState(Bundle outState) { 
    if(mToggleButton.isChecked()) { 
     Log.d(TAG, "onSaveInstanceState: toggleButton is checked...........****"); 
     outState.putString(TOGGLE_BUTTON_STATE, "ON"); 
    }else { 
     Log.d(TAG, "onSaveInstanceState: toggleButton is not checked...........*****"); 
     outState.putString(TOGGLE_BUTTON_STATE, "OFF"); 
    } 
    super.onSaveInstanceState(outState); 

}

カウントダウンタイマーも姿勢変更後に正常に動作して続けの
//Listener for the ToggleButton 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
//   Toast.makeText(this, "ON", Toast.LENGTH_SHORT).show(); 
//   TOGGLE_BUTTON_ON = true; 
      //getting the xml user_input to java 
      LayoutInflater inflater = LayoutInflater.from(this); 
      View view = inflater.inflate(R.layout.user_input, null); 
      //search inside the view for the text_input 
      mTextUserInput = (EditText) view.findViewById(R.id.text_input); 
      //We create the builder and we use it to add functionality to the dialog 
      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Please Enter The Time"); 
      //We create the user_input that has only the editext widget that we gonna use to get the 
      //time from the user 
      builder.setView(view); 
      builder.setPositiveButton("OK", this); 
      builder.setNegativeButton("Cancel", this); 
      builder.show(); 
     } else { 
      // OFF selected and timer must stop 
//   TOGGLE_BUTTON_ON = false; 
      timer.stop(); 
     } 
    } 

PS

+0

は、あなたが質問を編集して、警告ダイアログのコードを貼り付けることはできますか? – fernandospr

+0

質問が編集されました – Giannis

+0

画面の向きを変更するとアクティビティが破壊されないようにすることができます –

答えて

0

あなたのやり方はfalseです。あなたは状態を正しく保存していますが、私はそれをブール値として保存することをお勧めしますが、savedInstanceから正しく読み込みません。私はそれを行うだろう

方法:

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putBoolean("TOGGLE_BUTTON_STATE", mToggleButton.isChecked()); 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    ... 
    if(savedInstanceState != null) { 
     mToggleButton.setChecked(savedInstanceState.getBoolean("TOGGLE_BUTTON_STATE")); 
    } 
    mToggleButton.setOnCheckedChangeListener(this); 
    ... 
} 
+0

あなたの回答は小さな変更で機能しました。 outStateの設定は、superメソッドを呼び出す前に行う必要があります。 – Giannis

0

活動が破壊されようとしているときは、警告ダイアログを閉じることができます。例えば

onCreateに以前に保存された状態をロードする

@Override 
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    ... 
    // Save the dialog in an instance variable 
    mDialog = builder.show(); 
} 

@Override 
public void onStop() { 
    if (mDialog != null) { 
     mDialog.dismiss(); 
    } 
    super.onStop(); 
} 
関連する問題