Tôi đang sử dụng trình xem ảnh để vuốt giữa các đoạn và muốn nút quay lại điều hướng đến đoạn đã xem trước đó thay vì kết thúc hoạt động. Xin lỗi nếu đây là bản sao của this question tuy nhiên tôi không tìm thấy câu trả lời rất hữu ích. Rõ ràng onBackPressed cần phải được ghi đè, nhưng tôi không biết làm thế nào để có được và hiển thị các mảnh chính xác. Tôi giả sử rằng tôi nên sử dụng backstack fragmentmanager của, nhưng getSupportFragmentManager().getBackStackEntryCount()
luôn luôn trả về 0. Tôi có cần phải tự thêm các mảnh vỡ vào backstack sử dụng FragmentTransaction.addToBackStack()
? Nếu vậy, tôi sẽ thêm cái này vào bộ điều hợp ở đâu?Sử dụng backstack và nút quay lại trong viewpager
Đây là mã cho hoạt động của tôi,
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();
}
}
}
Người dùng có thể điều hướng theo một trong hai hướng để giải pháp thứ hai không hoạt động. Tôi vừa thử triển khai giải pháp đầu tiên bằng cách thêm một 'OnPageChangeListener' và ghi lại các chỉ mục ở đó nhưng hành vi không nhất quán. Đôi khi trang được hiển thị sẽ không thay đổi mặc dù tôi có thể thấy từ nhật ký rằng đoạn tiếp theo đã được khởi tạo. – Igd
Ngoài ra, việc theo dõi các chỉ mục theo cách thủ công cảm thấy giống như một giải pháp 'un-android' cho rằng backstack đã tồn tại cho mục đích này – Igd
Hmm, tôi không chắc tại sao có sự mâu thuẫn đó, nhưng điều quan trọng cần lưu ý là ViewPager thực sự giữ 3 trang được khởi tạo trong bộ nhớ mọi lúc: trang hiện tại, trang trước và trang tiếp theo. Do đó, nếu bạn hiện đang ở trang 2 (trang 1, 2 và 3 hiện đang được khởi tạo) và sau đó chuyển sang trang 3, ví dụ, trang 4 sẽ được khởi tạo và trang 1 sẽ bị xóa. –