8

ビューページャーを使用してフラグメント間をスワイプしていますが、アクティビティを終了するのではなく、前に表示したフラグメントに戻るボタンを使用したいと考えています。これがこの質問と重複している場合は申し訳ありませんが、回答があまり役に立ちませんでした。明らかに onBackPressed をオーバーライドする必要がありますが、正しいフラグメントを取得して表示する方法がわかりません。fragmentmanager のバックスタックを使用するgetSupportFragmentManager().getBackStackEntryCount()必要があると思いますが、常に 0 を返しますFragmentTransaction.addToBackStack()。もしそうなら、これをアダプターのどこに追加しますか?

これが私の活動のコードです。

public class PagerActivity extends FragmentActivity {

ArrayList<Sale> sales;
MyAdapter mAdapter;
ViewPager mPager;

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

    Intent it = getIntent();
    this.sales = (ArrayList<Sale>) it.getExtras().get("sales");
    int position = it.getExtras().getInt("position");

    ActionBar actionBar = getActionBar();
    actionBar.setDisplayHomeAsUpEnabled(true);

    setContentView(R.layout.fragment_pager);
    mAdapter = new MyAdapter(getSupportFragmentManager());
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);
    mPager.setCurrentItem(position);

}

public class MyAdapter extends FragmentPagerAdapter {
    public MyAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public int getCount() {
        return sales.size();
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        super.destroyItem(container, position, object);
    }

    @Override
    public Fragment getItem(int position) {
        SalesThumbFragment frag = new SalesThumbFragment();
        return frag.newInstance(sales.get(position));
    }
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case android.R.id.home:
        finish();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.sales_controller, menu);
    return true;
}

@Override
public void onBackPressed() {
  if(getSupportFragmentManager().getBackStackEntryCount() != 0) {
    getSupportFragmentManager().popBackStack();
  } else {

    super.onBackPressed();
  }
}


}
4

5 に答える 5

8

新しい設計サポート ライブラリでは、これ
を使用します。同じ問題があり、この手順に従います。

ビューページャーに 3 つのフラグメントがあるメイン アクティビティで、スタックを作成し、データをプッシュおよびポップします。

//private Stack<Integer> stackkk;  ==> As i get edit suggestion 
private Stack<Integer> stackkk = new Stack<>(); // Edited 
private ViewPager mPager;
private int tabPosition = 0;



    mTabLayout.setupWithViewPager(mPager);
    mPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
    mTabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            tabPosition = tab.getPosition();
            mPager.setCurrentItem(tab.getPosition());

            if (stackkk.empty())
                stackkk.push(0);

            if (stackkk.contains(tabPosition)) {
                stackkk.remove(stackkk.indexOf(tabPosition));
                stackkk.push(tabPosition);
            } else {
                stackkk.push(tabPosition);
            }
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
            tabPositionUnselected = tab.getPosition();
        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}

onBackPressed in アクティビティでは、

@Override
public void onBackPressed() {
    if (stackkk.size() > 1) {
        stackkk.pop();
        mPager.setCurrentItem(stackkk.lastElement());
    } else {
    }
}
于 2015-10-09T01:28:06.180 に答える
2

Fragment Activity クラスでこのコードを使用します。return true; を追加することを忘れないでください。

public boolean onKeyDown(int keyCode, KeyEvent event) {

    // TODO Auto-generated method stub
    if ((keyCode == KeyEvent.KEYCODE_BACK)) {

            mViewPager.setCurrentItem(viewPageSelected - 1);
            return true;
        }

    return super.onKeyDown(keyCode, event);

}
于 2015-04-10T11:40:42.580 に答える
1

私は同様の問題を抱えていましたが、これが私がそれを解決した方法です。問題が何であるかを理解していれば、コードを問題に適応させることができると思います。私は 6 つのフラグメントを持つ ViewPager を持っていて、ページの履歴を追跡し、戻るボタンを使用して履歴を逆方向に移動できるようにしたいと考えていました。オブジェクトを作成しjava.util.Stack<Integer>、それにフラグメント番号を追加し ([戻る] ボタンを使用する場合を除く。以下を参照)、onBackPressed()履歴スタックが空でない場合は、バック スタックを使用する代わりに、最後に表示されたフラグメントをポップするようにオーバーライドします。

戻るボタンを押したときに要素をスタックにプッシュしないようにする必要があります。そうしないと、戻るボタンを押し続けると、最終的に終了するのではなく、2 つのフラグメントの間でスタックしてしまいます。

私のコード:

MyAdapter mAdapter;
ViewPager mPager;
Stack<Integer> pageHistory;
int currentPage;
boolean saveToHistory;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mAdapter = new MyAdapter(getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.container);
    mPager.setAdapter(mAdapter);
    mPager.setOffscreenPageLimit(5);

    pageHistory = new Stack<Integer>();
    mPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int arg0) {
            if(saveToHistory)
                pageHistory.push(Integer.valueOf(currentPage));
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
    saveToHistory = true;
}

@Override
public void onBackPressed() {
    if(pageHistory.empty())
        super.onBackPressed();
    else {
        saveToHistory = false;
        mPager.setCurrentItem(pageHistory.pop().intValue());
        saveToHistory = true;
    }
};
于 2014-09-26T16:12:27.087 に答える
0

カスタム ViewPager を作成し、スタック機能を実装しました。

public class CustomViewPager extends ViewPager {

private Stack<Integer> stack = new Stack<>();

@Override
public void setCurrentItem(int item, boolean smoothScroll) {
    stack.push(getCurrentItem());
    super.setCurrentItem(item, smoothScroll);
}

public int popFromBackStack(boolean smoothScroll) {
    if (stack.size()>0) {
        super.setCurrentItem(stack.pop(), smoothScroll);
        return getCurrentItem();
    } else return -1;
}
于 2016-09-29T10:06:08.103 に答える
0

mPager.getCurrentItem()フィールドを使用して、ユーザーが新しいフラグメントに移動するたびに afterを使用して前のページのインデックスを追跡する場合、onBackPressed()メソッドで次のように呼び出すことができます。mPager.setCurrentItem(previousPage)

または、ユーザーが順番にしかページを移動できない場合は、フィールドはまったく必要ありません。mPager.setCurrentItem(mPager.getCurrentItem()-1)

于 2013-08-27T03:39:16.287 に答える