在android应用程序中,我正在将数据从Db加载到的TableView
内部Fragment
。但是,当我重新加载Fragment
它时,它将显示以前的数据。我可以Fragment
用当前数据代替以前的数据来重新填充吗?
在android应用程序中,我正在将数据从Db加载到的TableView
内部Fragment
。但是,当我重新加载Fragment
它时,它将显示以前的数据。我可以Fragment
用当前数据代替以前的数据来重新填充吗?
Answers:
我认为您想在数据库更新时刷新片段内容
如果是这样,请拆下碎片并重新连接
// 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标签,以下代码对我来说效果很好。
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...
吗?
您可以在用户可见时刷新您的片段,只需将此代码添加到您的片段中,这将在您可见时刷新您的片段。
@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");
}
}
要刷新片段,可接受的答案将不适用于牛轧糖及更高版本。要使其在所有操作系统上都能正常工作,您可以执行以下操作。
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();
}
当片段附加到Activity时,您将无法重新加载该片段,在该活动中您将获得“ 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,您将需要从活动中重新查询上下文,因为除非您没有从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()
}
}
}
我有同样的问题,但是以上都不适合我。要么有一个后退问题(加载后,当用户按下时它将再次走相同的片段),或者它没有调用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。如果你想重新加载
getActivity().getSupportFragmentManager().beginTransaction().replace(GeneralInfo.this.getId(), new GeneralInfo()).commit();
GeneralInfo
这是我的片段课 GeneralInfo.java
我把它作为方法放在片段类中:
public void Reload(){
getActivity().getSupportFragmentManager().beginTransaction().replace(LogActivity.this.getId(), new LogActivity()).commit();
}
最简单的方法
制作一个包含viewpager.setAdapter的公共静态方法
使适配器和viewpager静态
public static void refreshFragments(){
viewPager.setAdapter(adapter);
}
随时随地打电话,任何活动,任何片段。
MainActivity.refreshFragments();