2

カスタムの SurveyPage クラスによって生成されたビューをページングする FragmentPagerAdapter があります。ページャーの最終ページは、SurveyFinishPage によって生成されます。SurveyFinishPage は、FragmentPagerAdapter に関連付けられた Survey にアクセスしようとし、すべての調査回答をまとめて表示します。Survey オブジェクトは、メイン アクティビティの getSurvey() メソッドを介して SurveyFinishPage によって取得されます。

通常、これは正常に機能し、SurveyFinishPage は FragmentPagerAdapter が使用している同じ Survey オブジェクトにアクセスできます。ただし、Activity が強制終了されて復元された場合、SurveyFinishPage はまだ古い Survey (またはおそらくそのコピー) にアクセスしているように見えます。新しく再構築された回答への変更に関係なく、Activity が破棄される前の回答が表示されます。調査。

MainActivity がその Survey オブジェクトを FragmentPagerAdapter に渡し、そのオブジェクトを使用して Fragments を作成するため、MainActivity の onRestoreInstanceState() で aSurvey の値を復元すると、他のすべての Survey オブジェクトが確立されるように思えますが、代わりに、 FragmentPagerAdapter と SurveyFinishPage は、2 つの異なるものを見ています。

FragmentPagerAdapter 内のフラグメントの状態を適切に復元して、すべてが同じ Survey オブジェクトを参照するようにするにはどうすればよいですか?

MainActivity.java

public class MainActivity extends FragmentActivity {
    SurveyPagerAdapter mSurveyPagerAdapter;
    ViewPager mViewPager;
    Survey aSurvey;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main_poll);

        if(savedInstanceState != null) {
            testSurvey = savedInstanceState.getParcelable("survey");
        }
        else {
            testSurvey = new Survey();
        }
        mSurveyPagerAdapter = new SurveyPagerAdapter(getSupportFragmentManager(), aSurvey);
        mViewPager = (ViewPager) findViewById(R.id.pager);
        mViewPager.setAdapter(mSurveyPagerAdapter);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putParcelable("survey", aSurvey);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        aSurvey = (Survey)savedInstanceState.getParcelable("survey");
    }
    [...]
}

SurveyPagerAdapter.java

public class SurveyPagerAdapter extends FragmentPagerAdapter {
    private Survey survey;
    [...]

    @Override
    public Fragment getItem(int i) {
        Fragment fragment;
        Bundle args = new Bundle();

        // index 0 is the title page
        if(i == 0) {
            fragment = new SurveyTitlePage();
        }
        // final index is the finish page
        else if(i == getCount()-1) {
            fragment = new SurveyFinishPage();
        }
        // all other indices are regular poll pages
        else {
            args.putParcelable("question", survey.getQuestion(i-1));
            fragment = new SurveyPage();
            fragment.setArguments(args);
        }

        return fragment;
    }
    [...]
}

SurveyFinishPage.java

public class SurveyFinishPage extends Fragment {
    private Survey survey;
    [...]

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    setSurvey(((MainPoll)getActivity()).getSurvey());
    LinearLayout view = new LinearLayout(getActivity());
    view.setOrientation(LinearLayout.VERTICAL);

    Button finishButton = new Button(getActivity());
    finishButton.setText("FINISH");

        final TextView textView = new TextView(getActivity());
        finishButton.setOnClickListener(new Button.OnClickListener() {
            @Override
            public void onClick(View v) {
                String output = "";

                for(int i=0; i<survey.getSize(); i++) {
                    try {
                        output += survey.getQuestion(i).getPrompt() + " - " + survey.getQuestion(i).getAnswer() + "\n";
                    } catch (Exception e) {
                        output += survey.getQuestion(i).getPrompt() + " - " + "no answer\n";
                    }
                }
                textView.setText(output);
            }
        });

        view.addView(finishButton);
        view.addView(textView);

        return view;
    }
}

SurveyPage.java

public class SurveyPage extends Fragment {
        [...]

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            Bundle args = getArguments();
            Question question = args.getParcelable("question");
            View pageView = question.getQuestionView(getActivity(), container);
        return pageView;
    }
}
4

1 に答える 1

1

Survey オブジェクトを Android アプリケーション クラスに持ち上げて、それをシングルトンとして参照できます。その答えはおそらくいくつかの議論を引き起こすでしょうが、それはあなたの問題に対する合理的な解決策です. Android では、アプリケーションのインスタンスが 1 つしか存在しないことが保証されているため、Survey のインスタンスが 1 つしかないことを (理由の範囲内で) 確信できます。

http://developer.android.com/guide/faq/framework.html

シングルトン クラス

シングルトンを使用すると、アプリケーション コンポーネントが同じプロセスで実行されるという事実を利用できます。これは、インスタンスを 1 つだけ持つように設計されたクラスです。インスタンスを返す getInstance() などの名前の静的メソッドがあります。このメソッドが初めて呼び出されたときに、グローバル インスタンスが作成されます。すべての呼び出し元が同じインスタンスを取得するため、これを対話のポイントとして使用できます。たとえば、アクティビティ A はインスタンスを取得して setValue(3) を呼び出します。後でアクティビティ B がインスタンスを取得し、getValue() を呼び出して、最後に設定された値を取得する場合があります。

于 2012-08-31T03:20:08.313 に答える