ในแอปพลิเคชัน Android ฉันกำลังโหลดข้อมูลจาก Db เข้าไปTableView
ในไฟล์Fragment
. แต่เมื่อฉันโหลดซ้ำFragment
มันจะแสดงข้อมูลก่อนหน้านี้ ฉันสามารถเติมFragment
ข้อมูลใหม่ด้วยข้อมูลปัจจุบันแทนข้อมูลก่อนหน้าได้หรือไม่
ในแอปพลิเคชัน Android ฉันกำลังโหลดข้อมูลจาก Db เข้าไปTableView
ในไฟล์Fragment
. แต่เมื่อฉันโหลดซ้ำFragment
มันจะแสดงข้อมูลก่อนหน้านี้ ฉันสามารถเติมFragment
ข้อมูลใหม่ด้วยข้อมูลปัจจุบันแทนข้อมูลก่อนหน้าได้หรือไม่
คำตอบ:
ฉันคิดว่าคุณต้องการรีเฟรชเนื้อหาส่วนย่อยเมื่ออัปเดต db
ถ้าเป็นเช่นนั้นให้ถอดชิ้นส่วนออกและใส่กลับเข้าไปใหม่
// 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 คือชื่อที่คุณตั้งให้กับส่วนย่อยของคุณเมื่อสร้างขึ้น
รหัสนี้ใช้สำหรับไลบรารีสนับสนุน
หากคุณไม่รองรับอุปกรณ์รุ่นเก่าให้ใช้getFragmentManagerแทนgetSupportFragmentManager
[แก้ไข]
วิธีนี้ต้องการให้ Fragment มีแท็ก
ในกรณีที่คุณไม่มีวิธีการของ @ Hammer คือสิ่งที่คุณต้องการ
สิ่งนี้จะรีเฟรชส่วนปัจจุบัน:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
ในกรณีที่คุณไม่มีแท็กแฟรกเมนต์โค้ดต่อไปนี้ใช้ได้ดีสำหรับฉัน
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()
ในกิจกรรมของฉันไม่ได้ ฉันควรใช้Activity.this...
?
คุณสามารถรีเฟรชส่วนของคุณเมื่อผู้ใช้มองเห็นได้เพียงแค่เพิ่มรหัสนี้ลงใน Fragment ของคุณสิ่งนี้จะรีเฟรชส่วนของคุณเมื่อมองเห็นได้
@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");
}
}
ในการรีเฟรชคำตอบที่ยอมรับส่วนย่อยจะไม่สามารถใช้ได้กับ Nougat และเวอร์ชันที่สูงกว่า เพื่อให้ใช้งานได้กับระบบปฏิบัติการทั้งหมดคุณสามารถทำได้ดังต่อไปนี้
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();
}
คุณไม่สามารถโหลดส่วนนี้ซ้ำได้ในขณะที่เชื่อมต่อกับกิจกรรมซึ่งคุณจะได้รับFragment Already Added
ข้อยกเว้น ""
ดังนั้นชิ้นส่วนจะต้องถูกแยกออกจากกิจกรรมก่อนแล้วจึงแนบ ทั้งหมดสามารถทำได้โดยใช้ API ที่คล่องแคล่วในบรรทัดเดียว:
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
อัปเดต: นี่คือการรวมการเปลี่ยนแปลงที่ทำกับ API 26 ขึ้นไป:
FragmentTransaction transaction = mActivity.getFragmentManager()
.beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
transaction.setReorderingAllowed(false);
}
transaction.detach(this).attach
(this).commit();
สำหรับรายละเอียดเพิ่มเติมของการอัปเดตโปรดดูhttps://stackoverflow.com/a/51327440/4514796
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
สิ่งนี้จะใช้ได้เฉพาะเมื่อคุณใช้FragmentManager
เพื่อเริ่มต้นส่วน หากคุณมีเป็น<fragment ... />
XML จะไม่เรียกonCreateView
อีกครั้ง เสียเวลาไป 30 นาทีเพื่อคิดออก
สิ่งที่ฉันทำและมันใช้ได้ผลสำหรับฉันฉันใช้ firebase และเมื่อผู้ใช้ล็อกอินฉันต้องการรีเฟรช Fragment ปัจจุบันก่อนคุณจะต้องร้องขอบริบทจากกิจกรรมเนื่องจากแฟรกเมนต์ไม่มีวิธีรับบริบทเว้นแต่คุณจะตั้งค่าจากกิจกรรมหรือบริบทที่นี่ เป็นรหัสที่ฉันใช้และทำงานในภาษา kotlin ฉันคิดว่าคุณสามารถใช้สิ่งเดียวกันในคลาส 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()
}
}
}
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo
มันคือคลาส Fragment ของฉัน GeneralInfo.java
ฉันวางไว้เป็นวิธีการในคลาส Fragment:
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
ใช้ContentProvider
และโหลดข้อมูลโดยใช้ 'CursorLoader' ด้วยสถาปัตยกรรมนี้ข้อมูลของคุณจะถูกโหลดซ้ำโดยอัตโนมัติเมื่อมีการเปลี่ยนแปลงฐานข้อมูล ใช้เฟรมเวิร์กของบุคคลที่สามสำหรับคุณContentProvider
- คุณไม่ต้องการใช้งานด้วยตัวเอง ...
ฉันมีปัญหาเดียวกัน แต่ไม่มีข้อใดที่ใช้ได้ผลกับฉัน อาจมีปัญหา backstack (หลังจากโหลดเมื่อผู้ใช้กดกลับมันจะไปที่ส่วนเดียวกันอีกครั้ง) หรือไม่เรียกonCreaetView
ในที่สุดฉันก็ทำสิ่งนี้:
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();
}
จุดดีคือคุณไม่ต้องการแท็กหรือรหัสของส่วนเช่นกัน หากคุณต้องการโหลดซ้ำ
ใช้เมธอด onResume ... ทั้งในกิจกรรมแฟรกเมนต์และกิจกรรมที่ถือแฟรกเมนต์
ตัวอย่างเช่นกับ TabLayout: เพียงใช้ OnTabSelectedListener ในการโหลดหน้าซ้ำคุณสามารถใช้ SwipeRefreshLayout OnRefreshListener เช่นpublic class YourFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
onRefresh () วิธีการจะ @Override จากอินเทอร์เฟซเช่น:
@Override
public void onRefresh() {
loadData();
}
นี่คือเค้าโครง:
<com.google.android.material.tabs.TabLayout
android:id="@+id/tablayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimaryLighter"
app:tabGravity="fill"
app:tabIndicatorColor="@color/white"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/colorTextPrimary"
app:tabTextColor="@color/colorTextDisable" />
รหัสในกิจกรรมของคุณ
TabLayout tabLayout = (TabLayout) findViewById (R.id.tablayout); tabLayout.setupWithViewPager (viewPager);
tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
if (tab.getPosition() == 0) {
yourFragment1.onRefresh();
} else if (tab.getPosition() == 1) {
yourFragment2.onRefresh();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
protected void onResume() {
super.onResume();
viewPagerAdapter.notifyDataSetChanged();
}
เขียน viewpagerAdapter.notifyDataSetChanged (); ใน onResume () ใน MainActivity โชคดี :)
วิธีที่ง่ายที่สุด
สร้างวิธีการแบบคงที่สาธารณะที่มี viewpager.setAdapter
ทำให้อะแดปเตอร์และ viewpager คงที่
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
โทรได้ทุกที่กิจกรรมใด ๆ ชิ้นส่วนใด ๆ
MainActivity.refreshFragments();