1

アクションバー タブとして 2 つのフラグメントを持つアプリケーションがあります。タブを切り替えると、フラグメントがアタッチ/デタッチされます。タブを切り替えたり、方向を変更したり、戻るボタンを押してアプリケーションを終了したりするたびに、ビューが破棄されます。再度開いたときに元の状態に戻す必要があります。少なくとも方向の変更については、onSaveInstanceState を使用してそこにデータを保存し、ビューが再作成されたときにデータを復元できることを知っています。ただし、何らかの理由で、データが outState バンドルに適切に保存され、savedInstanceState バンドルから適切に読み取られたとしても、ビューは更新されるべきものに更新されません。たとえば、サービスを開始し、そのサービスの実行中に 2 つのボタンを非表示にし、別の 2 つのボタンを代わりに表示する必要があるとします。ブール値を使用して、サービスが実行されているかどうかを確認します。次に、それを outState に入れて、どのボタンを表示または非表示にするかを確認できるようにします。そのための私のコードは次のとおりです。

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

onCreateView で:

if (savedInstanceState != null) {
        isRunning = savedInstanceState.getBoolean("isRunning", false);
        if (isRunning) {
            showStopButton();
        }
}

showStopButton コードは次のとおりです。

private void showStopButton() {
    btnStart.setVisibility(View.GONE);
    btnReset.setVisibility(View.GONE);
    btnStop.setVisibility(View.VISIBLE);
    btnLoop.setVisibility(View.VISIBLE);
}

したがって、これはすべて機能し、サービスの実行中にブール値が true として検出され、showStopButton() が呼び出されます。ただし、実際には何もしていないようです。ビューステートは、実際に表示したいボタンの代わりに、最初の 2 つのボタン (非表示にしたい) が表示されているかのようにリセットされます。なぜこれが起こっているのか/それを修正する方法はありますか?

また、以前と同じ値を入力したままにしておく必要があるリストビューもあり、作業することもできません。

また、タブを切り替えるときに onSaveInstanceState は呼び出されません (戻るボタンを押したときにも呼び出されないと思いますか?)。これらの場合、ビューステートを保持するにはどうすればよいですか?

4

0 に答える 0