6

最近、アプリをアクティビティベースのアプリからフラグメントベースのアプリに変換しました。スコア保持アプリで、アクティビティの時は簡単にスコアの保存・復元ができました。ただし、それはフラグメントとして機能していないようです。これが私のコードです:

 @Override
public void onSaveInstanceState(Bundle savedInstanceState){
    super.onSaveInstanceState(savedInstanceState);

    if(t!=null&&flag==1){
        savedInstanceState.putInt("time", t.getTimeLeft());
    } else {
        savedInstanceState.putInt("time", 0);
    }

    savedInstanceState.putIntArray("score_array", points);
    savedInstanceState.putIntArray("position_array", spinnerPosition);
    savedInstanceState.putBooleanArray("checked_array", shouldBeChecked);

    flag = 0;
    Log.d("MyApp", "savingState");
}

@Override
public void onActivityCreated(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);

    Log.d("MyApp", "onActivityCreated");

    try {
        int timeLeft = savedInstanceState.getInt("time");

        points = savedInstanceState.getIntArray("score_array").clone();
        spinnerPosition = savedInstanceState.getIntArray("position_array").clone();
        shouldBeChecked = savedInstanceState.getBooleanArray("checked_array").clone();

        ((BaseAdapter) ((ListView)getView().findViewById(R.id.missionList)).getAdapter()).notifyDataSetChanged();

        if(timeLeft!=0){
            flag=1;

            this.getActivity().getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

            t = new TimerClass(timeLeft*1000, 1000);
            t.setViews((TextView)getView().findViewById(R.id.minuteView), (TextView)getView().findViewById(R.id.tenSecondView), (TextView)getView().findViewById(R.id.secondView), (Button)getView().findViewById(R.id.start_button));
            ((Button)getView().findViewById(R.id.start_button)).setText(R.string.stop);
            t.start();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } 

}

私は、try / catchを使用する場合と使用しないonRestoreInstanceState場合のアクティビティで、これとまったく同じコードを正常に使用しました。onActivityCreated問題は、バンドルから何かをプルしようとすると、nullポインタエラーが発生することです。ログに保存状態が表示され、次にonActivityCreatedが表示されますが、onActivityCreatedはonSavedInstanceStateによってバンドルに入れられたものを取得していないようです。を呼び出すすべての行でnullポインタを取得しますsavedInstanceState.getAnything()。しかし、私の読書から、、、、onCreateおよびonCreateViewすべてonActivityCreatedが同じバンドルを使用しています。コードを他の2つに移動しようとしましたが、うまくいきませんでした。

4

2 に答える 2

1

より良い答えが必要な人のために:

if(savedInstanceState!=null)nullポインタエラーを回避するために、アクセスする前に必ずテストしてください。また、フラグメントが破棄されると、onSaveInstanceState()がすべての場合にデータを保存できるわけではないことに注意してください。

特に、フラグメントがバックスタックにプッシュされ、デバイスが回転している場合。この場合、フラグメントがバックスタックにプッシュされたときにのみonDestoryView()が呼び出されるため、デバイスの回転中にonSaveInstanceState()が実行されると、ビューはすべて以前に破棄されたため、ビューからデータを保存できません。

回避策については、次のスレッドを参照してください。Fragmentsで開発するすべての人にとって便利だと思います。特にDroidTの答え: https ://stackoverflow.com/a/19744402/2517350

于 2014-01-20T22:28:28.610 に答える
0

私はかなりハッキーな回避策を思い付くことになった。それは実際にはコアの問題を解決していないので、それに興奮していません。誰かが私がそれを見つけるのを手伝ってくれるなら、私はこれについてその答えを喜んで受け入れます。

そうは言っても、私は単にアクティビティのonSaveInstanceStateとonRestoreInstanceStateを使用して、フラグメントデータを保存および復元しました。

于 2012-09-21T00:05:42.200 に答える