android - 重新加载时刷新片段
在Android应用程序中,我将数据从Db加载到Fragment内的TableView。但是当我重新加载Fragment时,它会显示以前的数据。 我可以用当前数据而不是以前的数据重新填充Fragment吗?
12个解决方案
180 votes
我想你想在db update上刷新片段内容
如果是这样,请分离片段并重新连接
// 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的方法就是您所需要的。
Fantômas answered 2019-09-14T01:41:31Z
126 votes
这将刷新当前片段:
FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
Mbengue Assane answered 2019-09-14T01:41:56Z
27 votes
如果您没有片段标记,以下代码适用于我。
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();}
}
Hammer answered 2019-09-14T01:42:20Z
4 votes
您可以在用户看到片段时刷新片段,只需将此代码添加到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");
}
}
Kaushik Khambhadiya answered 2019-09-14T01:42:46Z
3 votes
在将片段附加到活动时,您无法重新加载该片段,您将获得“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]
Ali Nem answered 2019-09-14T01:43:32Z
3 votes
要刷新片段,以上所有答案都不适用于Oreo及以上版本。 为了使它适用于所有操作系统,您可以执行以下操作。
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();
}
Sachin Jagtap answered 2019-09-14T01:43:58Z
2 votes
MyFragment fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag(FRAGMENT_TAG);
getSupportFragmentManager().beginTransaction().detach(fragment).attach(fragment).commit();
这只有在您使用FragmentManager初始化片段时才有效。 如果您将其作为XML格式的,则不会再次调用onCreateView。 浪费了我的30分钟来解决这个问题。
Irshu answered 2019-09-14T01:44:24Z
0 votes
使用ContentProvider并使用'CursorLoader'加载数据。 使用此架构,您的数据将在数据库更改时自动重新加载。 使用第二方框架为您的ContentProvider - 您真的不想自己实现它...
artkoenig answered 2019-09-14T01:44:52Z
0 votes
我遇到了同样的问题,但上述情况都没有。 要么有一个后端问题(在用户按下后加载它会再次进入相同的片段)或者它没有调用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();
}
好的一点是你不需要片段的标签或id。如果你想重装
Emad answered 2019-09-14T01:45:35Z
0 votes
这里我做了什么,它对我有用,我使用firebase,当用户登录时,我想首先刷新当前片段,你需要从活动中重新获取上下文,因为片段没有办法获取上下文,除非你在这里设置它来自Activity或context 是我使用和使用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()
}
}
}
hardiBSalih answered 2019-09-14T01:46:04Z
-1 votes
protected void onResume() {
super.onResume();
viewPagerAdapter.notifyDataSetChanged();
}
写viewpagerAdapter.notifyDataSetChanged(); 在MainActivity中的onResume()中。祝好运 :)
Handy Kim answered 2019-09-14T01:46:32Z
-1 votes
最简单的方法
创建一个包含viewpager.setAdapter的公共静态方法
make adapter和viewpager static
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
呼叫任何地方,任何活动,任何片段。
MainActivity.refreshFragments();
ryan christoper lucasan answered 2019-09-14T01:47:18Z