重新加载时刷新片段

Sam*_*age 98 android android-fragments

在一个TableView应用程序中,我将数据从a加载FragmentFragment内部a Fragment.但是,当我TableViewFragment它显示以前的数据.我可以Fragment使用当前数据而不是以前的数据重新填充吗?

Fan*_*mas 193

我想你想在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();
Run Code Online (Sandbox Code Playgroud)

Your_Fragment_TAG是您在创建片段时为其提供的名称

此代码用于支持库.

如果您不支持旧设备,只需使用getFragmentManager而不是getSupportFragmentManager

[编辑]

此方法要求Fragment具有标记.
如果您没有它,那么@ Hammer的方法就是您所需要的.

  • 这会产生以下错误 - java.lang.RuntimeException:将结果ResultInfo {who = null,request = 2,result = 3,data = null}传递给activity {xont.virtusel.v4.controller/xont.virtusel.v4.controller失败.sale.InvocieBrandActivity}:java.lang.IllegalStateException:onSaveInstanceState后无法执行此操作 (3认同)
  • @IntelliJAmiya很高兴知道,先生! (2认同)

Mbe*_*ane 136

这将刷新当前片段:

FragmentTransaction ft = getFragmentManager().beginTransaction();
if (Build.VERSION.SDK_INT >= 26) {
   ft.setReorderingAllowed(false);
}
ft.detach(this).attach(this).commit();
Run Code Online (Sandbox Code Playgroud)

  • 递归,递归,无休止的通话 (5认同)
  • 把这段代码放在哪里?内部活动或片段本身? (2认同)
  • 你把它放在需要刷新的片段中. (2认同)
  • 使用这个在片段中的onResume中创建一个循环,如何避免它? (2认同)

Ham*_*mer 29

如果您没有片段标记,以下代码适用于我.

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();}
}
Run Code Online (Sandbox Code Playgroud)


Kau*_*iya 11

您可以在用户可见时刷新您的片段,只需将此代码添加到您的 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • setUserVisibleHint 已弃用 (2认同)

J.G*_*.G. 8

如果您使用 NavController,请尝试以下操作 (kotlin):

val navController = findNavController()
navController.run {
    popBackStack()
    navigate(R.id.yourFragment)
}
Run Code Online (Sandbox Code Playgroud)


Sac*_*tap 7

要刷新片段,可接受的答案将不适用于牛轧糖及更高版本。要使其在所有操作系统上都能正常工作,您可以执行以下操作。

    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();
    }
Run Code Online (Sandbox Code Playgroud)


小智 6

如果您使用导航组件,
您可以使用navigate(this_fragment_id)导航到此片段,但在新实例中。此外,您还必须先弹出后退堆栈才能删除实际的片段。

科特林

val navController: NavController = 
     requireActivity().findNavController(R.id.navHostFragment)
navController.run {
            popBackStack()
            navigate(R.id.this_fragment_id)
        }
Run Code Online (Sandbox Code Playgroud)

爪哇

NavController navController = 
    requireActivity().findNavController(R.id.navHostFragment);
navController.popBackStack();
navController.navigate(R.id.this_fragment_id);
Run Code Online (Sandbox Code Playgroud)


Ali*_*Nem 5

当片段附加到Activity时,您将无法重新加载该片段,在该活动中会出现“ Fragment Already Added”异常。

因此,必须先将片段与其活动分离,然后再附加。可以使用流利的api在一行中完成所有操作:

getFragmentManager().beginTransaction().detach(this).attach(this).commit();
Run Code Online (Sandbox Code Playgroud)

更新: 这是为了合并对API 26及更高版本所做的更改:

FragmentTransaction transaction = mActivity.getFragmentManager()
                        .beginTransaction();
                if (Build.VERSION.SDK_INT >= 26) {
                    transaction.setReorderingAllowed(false);
                }
                transaction.detach(this).attach
                        (this).commit();
Run Code Online (Sandbox Code Playgroud)

有关更新的更多说明,请参见/sf/answers/3592920831/

  • 请为您的答案提供清晰的说明。不要编写代码,而要给出共享代码的解释,以便其他人也可以理解,这将有所帮助。我要求您阅读FAQ部分,以便有效地使用Stack Overflow。 (2认同)