10

view pager を使用してレンダリングされる Frag A と Frag B の 2 つのフラグメントがあります。ユーザーが A から B にスワイプしてから戻るボタンを押した場合 (B にいる場合)、ユーザーはビュー ページャーから出るのではなく、A に移動する必要があります。どうすればこれを達成できますか?

バックスタックにトランザクションを追加しても効果がないようです。

ありがとう

4

3 に答える 3

21

onKeyDown()のメソッドをオーバーライドする必要がありますActivity

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        myViewPager.setCurrentItem(0, true);
        return true;
    } else {
       return super.onKeyDown(keyCode, event);
    }
}

これにより、「戻る」ボタンの押下イベントがキャプチャされ、ユーザーがViewPagerの最初のアイテムに移動します。

ユーザーがスワイプした場合にのみ戻るために使用できるViewPager#getCurrentItem()もあります。このような実装:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && myViewPager.getCurrentItem() == 1) {
        myViewPager.setCurrentItem(0, true);
        return true;
    } else {
       return super.onKeyDown(keyCode, event);
    }
}

ユーザーが次のページにいる場合にのみ、ユーザーを前のページに戻します。それ以外の場合は、通常どおり「戻る」と登録され、ユーザーは期待どおりに終了します。

ユーザーが前のページに戻る場合が必要になる場合があります(2ページ以上あると仮定します)。この場合、ViewPager.OnPageChangeListener()を実装し、が呼び出されるたびに位置を保存する必要がありonPageSelected(int position)ます。それらをスタックに実装すると、ユーザーが「戻る」を押すたびにそれらをポップオフできます。スタックが空になったら、アプリを終了します。

編集

Jade Byfieldのコメントで正しく述べられているように、これを行うための少し簡単な方法onBackPressed()は、アクティビティで使用することです。これは、APIレベル5以降でのみ機能します。

@Override
public void onBackPressed() {
  if(i_dont_want_to_leave) {
     myViewPager.setCurrentItem(0, true);
  } else {
    super.onBackPressed(); // This will pop the Activity from the stack.
  }
}
于 2012-11-01T21:14:04.707 に答える