Tôi đang sử dụng một ViewPager cùng với một FragmentPagerAdapter để lưu trữ ba mảnh khác nhauThay thế đoạn với một mảnh bên ViewPager
[Fragment1][Fragment2][Fragment3]
Những gì tôi đang cố gắng để đạt được là để thay thế thành công Fragment1 với một mảnh hoàn toàn mới, Fragment4, nếu một nhiệm vụ cụ thể thành công.
Khi tôi sử dụng ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.fragment1_layout_id, fragment4);
transaction.commit();
..the đoạn được thay thế đẹp và Fragment4 được hiển thị thay vì Fragment1. Mặc dù ngay sau khi tôi vuốt tất cả các cách để Fragment3 và sau đó trở lại Fragment4, Fragment1 đã trở lại.
Sau đó, một lần nữa, nếu tôi sử dụng ..
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.remove(fragment1);
transaction.commit();
..Fragment1 được lấy ra và khi tôi quay trở lại Fragment4 là ở đó. Vì vậy, vấn đề với giải pháp này là tôi không thể tìm thấy một cách để ngay lập tức hiển thị Fragment4 như Fragment1 được lấy ra, ngay cả khi tôi đã cố gắng:
transaction.add(fragment4);
transaction.show(fragment4);
Và dưới đây là cách thực hiện FragmentPagerAdapter của tôi trông như thế vào lúc này, không bất kỳ giao dịch nào quản lý:
public static class PagerAdapter extends FragmentPagerAdapter {
public PagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
return VIEW_COUNT;
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = Fragment1.newInstance(context_);
break;
case 1:
fragment = Fragment2.newInstance(context_);
break;
case 2:
fragment = Fragment3.newInstance(context_);
break;
default:
break;
}
return fragment;
}
}
Chỉnh sửa.
Vì vậy, có vẻ như tôi không hoàn toàn rõ ràng với câu hỏi của mình. Tôi quyết định loại bỏ tất cả các spaghetti tôi quản lý để tạo ra trước đó và cố gắng để nói rằng tôi đã rời chúng đi (xem văn bản in đậm ở trên).
Dù sao đây là khá nhiều những gì tôi đã cố gắng để làm bên GetItem():
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
if (!app.isUserLoggedIn) {
if (loginFragment_ == null) {
loginFragment_ = LoginFragment.newInstance(context_);
transaction_ = fragmentManager_.beginTransaction();
if (logoutFragment_ != null) {
transaction_.remove(logoutFragment_);
logoutFragment_ = null;
}
transaction_.add(loginFragment_, "login");
transaction_.commit();
}
if (fragmentManager_.findFragmentByTag("login") == null)
fragment = LoginFragment.newInstance(context_);
else
fragment = fragmentManager_.findFragmentByTag("login");
} else {
if (logoutFragment_ == null) {
logoutFragment_ = LogoutFragment.newInstance(context_);
transaction_ = fragmentManager_.beginTransaction();
if (loginFragment_ != null) {
transaction_.remove(loginFragment_);
loginFragment_ = null;
}
transaction_.add(logoutFragment_, "logout");
transaction_.commit();
}
if (fragmentManager_.findFragmentByTag("logout") == null)
fragment = LogoutFragment.newInstance(context_);
else
fragment = fragmentManager_.findFragmentByTag("logout");
}
break;
case 1:
fragment = HomeFragment.newInstance(context_);
break;
case 2:
fragment = RegisterFragment.newInstance(context_);
break;
default:
break;
}
return fragment;
}
Với mã này, tôi nhận được gì thực hiện, nhưng nếu ai đó nhìn thấy những gì tôi đang làm sai và muốn chỉ tôi đi đúng hướng, tôi đánh giá cao nó rất nhiều!
Tôi nghĩ bạn nên thay đổi getItem trong PagerAdapter. Có mảnh bị trả lại mà phải được nhìn thấy. – pawelzieba
@dziobas Đó là chính xác nơi tôi đã cố gắng để làm phép thuật tôi mô tả trong câu hỏi của tôi, không có may mắn. – velu
fragment2 được gọi khi tôi nhấp vào tab1, tôi không biết tại sao tab2 được gọi? lỗi bộ điều hợp là gì? –