Trong một ứng dụng android, tôi đang tải dữ liệu từ Db vào TableView
bên trong a Fragment
. Nhưng khi tôi tải lại Fragment
nó sẽ hiển thị dữ liệu trước đó. Tôi có thể tạo lại Fragment
dữ liệu hiện tại thay vì dữ liệu trước đó không?
Trong một ứng dụng android, tôi đang tải dữ liệu từ Db vào TableView
bên trong a Fragment
. Nhưng khi tôi tải lại Fragment
nó sẽ hiển thị dữ liệu trước đó. Tôi có thể tạo lại Fragment
dữ liệu hiện tại thay vì dữ liệu trước đó không?
Câu trả lời:
Tôi nghĩ bạn muốn làm mới nội dung phân đoạn khi cập nhật db
Nếu vậy, hãy tách mảnh ra và gắn lại
// Reload current fragment
Fragment frg = null;
frg = getSupportFragmentManager().findFragmentByTag("Your_Fragment_TAG");
final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(frg);
ft.attach(frg);
ft.commit();
Your_Fragment_TAG là tên bạn đã đặt cho phân đoạn của mình khi tạo ra nó
Mã này dành cho thư viện hỗ trợ.
Nếu bạn không hỗ trợ các thiết bị cũ hơn, chỉ cần sử dụng getFragmentManager thay vì getSupportFragmentManager
[BIÊN TẬP]
Phương thức này yêu cầu Fragment phải có một thẻ.
Trong trường hợp bạn không có nó, thì phương pháp của @ Hammer là những gì bạn cần.
Điều này sẽ làm mới phân đoạn hiện tại:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
Trong trường hợp bạn không có thẻ phân mảnh, mã sau hoạt động tốt đối với tôi.
Fragment currentFragment = getActivity().getFragmentManager().findFragmentById(R.id.fragment_container);
if (currentFragment instanceof "NAME OF YOUR FRAGMENT CLASS") {
FragmentTransaction fragTransaction = (getActivity()).getFragmentManager().beginTransaction();
fragTransaction.detach(currentFragment);
fragTransaction.attach(currentFragment);
fragTransaction.commit();}
}
getActivity()
trong Hoạt động của tôi. Tôi có nên sử dụng Activity.this...
không?
bạn có thể làm mới phân đoạn của mình khi nó hiển thị với người dùng, chỉ cần thêm mã này vào Phân đoạn của bạn, mã này sẽ làm mới phân đoạn của bạn khi nó được hiển thị.
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
// Refresh your fragment here
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Log.i("IsRefresh", "Yes");
}
}
Để làm mới đoạn được chấp nhận, câu trả lời sẽ không hoạt động trên phiên bản Nougat trở lên. Để làm cho nó hoạt động trên tất cả các hệ điều hành, bạn có thể làm như sau.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
fragmentManager.beginTransaction().detach(this).commitNow();
fragmentManager.beginTransaction().attach(this).commitNow();
} else {
fragmentManager.beginTransaction().detach(this).attach(this).commit();
}
Bạn không thể tải lại phân đoạn khi nó được đính kèm với Hoạt động, nơi bạn nhận được Fragment Already Added
ngoại lệ "".
Vì vậy, đoạn đầu tiên phải được tách ra khỏi hoạt động của nó và sau đó được gắn vào. Tất cả có thể được thực hiện bằng cách sử dụng api thông thạo trong một dòng:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Cập nhật: Điều này là để kết hợp các thay đổi được thực hiện cho API 26 trở lên:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
Để biết thêm mô tả về bản cập nhật, vui lòng xem https://stackoverflow.com/a/51327440/4514796
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
điều này sẽ chỉ hoạt động nếu bạn sử dụng FragmentManager
để khởi tạo phân mảnh. Nếu bạn có nó dưới <fragment ... />
dạng XML, nó sẽ không gọi onCreateView
lại. Lãng phí 30 phút của tôi để tìm ra điều này.
Đây là những gì tôi đã làm và nó hoạt động với tôi, tôi sử dụng firebase và khi người dùng đăng nhập, tôi muốn làm mới Fragment hiện tại, trước tiên, bạn sẽ cần yêu cầu ngữ cảnh từ hoạt động vì phân mảnh không có cách nào để lấy ngữ cảnh trừ khi bạn đặt nó từ Activity hoặc ngữ cảnh ở đây là mã tôi đã sử dụng và làm việc bằng ngôn ngữ kotlin, tôi nghĩ bạn có thể sử dụng mã tương tự trong lớp java
override fun setUserVisibleHint(isVisibleToUser: Boolean) {
super.setUserVisibleHint(isVisibleToUser)
val context = requireActivity()
if (auth.currentUser != null) {
if (isVisibleToUser){
context.supportFragmentManager.beginTransaction().detach(this).attach(this).commit()
}
}
}
Sử dụng a ContentProvider
và tải dữ liệu của bạn bằng 'CursorLoader'. Với kiến trúc này, dữ liệu của bạn sẽ được tự động tải lại khi thay đổi cơ sở dữ liệu. Sử dụng các khuôn khổ của bên thứ ba cho của bạn ContentProvider
- bạn không thực sự muốn tự mình triển khai ...
Tôi đã gặp vấn đề tương tự nhưng không có vấn đề nào ở trên phù hợp với tôi. hoặc đã xảy ra sự cố backstack (sau khi tải khi người dùng nhấn lại, nó sẽ quay lại cùng một phân đoạn) hoặc nó không gọionCreaetView
cuối cùng tôi đã làm điều này:
public void transactFragment(Fragment fragment, boolean reload) {
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (reload) {
getSupportFragmentManager().popBackStack();
}
transaction.replace(R.id.main_activity_frame_layout, fragment);
transaction.addToBackStack(null);
transaction.commit();
}
điểm tốt là bạn cũng không cần thẻ hoặc id của phân đoạn. nếu bạn muốn tải lại
Sử dụng phương pháp onResume ... cả trên hoạt động phân mảnh và hoạt động giữ phân mảnh.
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo
đó là lớp Fragment của tôi GeneralInfo.java
Tôi đặt nó như một phương thức trong lớp phân mảnh:
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
Cách dễ nhất
tạo một phương thức tĩnh công khai chứa viewpager.setAdapter
làm cho bộ điều hợp và khung xem tĩnh
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
gọi ở bất kỳ đâu, bất kỳ hoạt động nào, bất kỳ phân đoạn nào.
MainActivity.refreshFragments();