7

私はViewPager多肢選択式試験アプリに を使用しています。これは、より大きなセットからランダムに 30 の質問を選択します。PageAdapterにページを提供している でこれを行いViewPagerます。

問題は、方向の変更が発生すると、ページャーだけでなくアダプターもリロードされることです。現在のページャーの位置を保存する方法は知っていますが、アダプターがリセットされると、セットから新しい質問も選択されます。これを処理する適切な方法は何でしょうか?

また、補足質問 - RadioGroups に選択肢を登録する最良の方法は何ですか? 直接クリックするか、別の方法で?

私はAndroidアプリの開発にかなり慣れていません。


アクティビティ:

public class MyActivity extends SherlockActivity {
    ActionBar actionBar;
    ViewPager pager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        pager = new ViewPager(this);
        setContentView(pager);
        QuestionsAdapter adapter = new QuestionsAdapter(this);
        pager.setAdapter(adapter);

        int position = 0;
        if (savedInstanceState != null) {
            position = savedInstanceState.getInt("Q_NUMBER");
        }         
        pager.setCurrentItem(position);
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        int position = pager.getCurrentItem();
        savedInstanceState.putInt("Q_NUMBER", position);
    }
}

アダプタ:

class QuestionsAdapter extends PagerAdapter {
    Context context;
    QuestionsHelper dbQuestions;
    boolean exam;
    List<HashMap<String,Object>> examQuestions;

    public QuestionsAdapter(Context context, boolean exam) {
        this.context = context;
        this.examQuestions = GetQuestionsFromDB(30);
    }

    public Object instantiateItem(View collection, int position) {
        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view;
        HashMap<String,Object> q;

        view = inflater.inflate(R.layout.exam_question_layout, null);
        q = getQuestion(position+1);

        ((TextView)view.findViewById(R.id.q_number)).setText(Integer.toString(position+1)+".");
        ((TextView)view.findViewById(R.id.q_question)).setText(q.get("question").toString());
        ((RadioButton)view.findViewById(R.id.q_answer_a)).setText(q.get("answer_a").toString());
        ((RadioButton)view.findViewById(R.id.q_answer_b)).setText(q.get("answer_b").toString());
        ((RadioButton)view.findViewById(R.id.q_answer_c)).setText(q.get("answer_c").toString());

        ((ViewPager)collection).addView(view, 0);
        return view;
    }
}
4

2 に答える 2

12

画面の回転は、画面全体を新しい向きで再描画します。構成の変更をオーバーライドすることでこれを防ぐことができます。

Android マニフェストの画面宣言の下に android:configChanges="orientation|screenSize" を追加します。

 android:configChanges="orientation|screenSize"

そして、あなたのアクティビティで onConfigurationChanged(Configuration) をオーバーライドします

 @Override
 public void onConfigurationChanged(Configuration newConfig) {
     super.onConfigurationChanged(newConfig);
 }
于 2013-01-14T18:15:28.743 に答える
4

現在のポケットベルの位置を保存する方法は知っていますが、アダプターがリセットされると、セットから新しい質問も選択されます。これを処理する適切な方法は何でしょうか?

あなたの質問には、idそれらを一意に識別するための が必要です。データベースからそれらを取得する方法はわかりませんが、その場合は ID を保存する必要があります。また:

  • アダプターlongには、現在選択されている質問のバッチの ID を表す 30 個の値を保持する配列 (または整数)が必要です。
  • アダプターに次のロジックを実装する必要があります。前のポイントからの長い配列が である場合、nullそれがクリーン スタートであると想定し、新しい 30 個の質問のセットを取得します。long 配列が null でない場合は、構成変更からの復元に直面しているため、これらの ID を使用して、ランダム バッチの代わりにデータベースから適切な質問を取得する必要があります。
  • では、アダプターの長い配列をmethod( )Activityに保存します。onSaveInstanceState()savedInstanceState.putLongArray
  • onCreateメソッドではActivity、アダプターを作成するときに、savedInstanceState Bundleそれが null でないかどうかを確認し、長い配列を持っているかどうかを確認し、それをアダプターに設定します (どの質問を取得するかがわかります)。

RadioGroups に選択肢を登録する最良の方法は何でしょうか? 直接クリックするか、別の方法で?

Parcelable上記の方法を使用するか、コメントで既に推奨されているようなカスタム クラスを作成できます。

于 2013-01-14T19:47:43.273 に答える