【问题标题】:Android - How to update a fragment in its own onResume?Android - 如何在自己的 onResume 中更新片段?
【发布时间】:2018-03-28 09:44:28
【问题描述】:

我有一个片段,我们称之为FragmentA。在FragmentA 内部,我启动了一个Activity,它更改了我在FragmentA 中显示的数据,一旦我完成了我启动的Activity,我将返回FragmentA。问题是,当这种情况发生时,FragmentA 仍然显示旧数据。因此,我尝试在 onResume 中将 FragmentA 替换为自身的新实例,但无济于事,因为现在 FragmentA 导致整个 viewpager(它所属的)冻结。

这是我的代码:

@Override
public void onResume() {
super.onResume();

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.detach(this);
fragmentTransaction.attach(this);
fragmentTransaction.commit();

}

我也尝试用这个代码替换FragmentA

@Override
public void onResume() {

FragmentTransaction fragmentTransaction = getActivity().getSupportFragmentManager().beginTransaction();

FragmentA fragment = FragmentA.newInstance();
fragmentTransaction.replace(ID?, fragment);

fragmentTransaction.commit();

}

但我不知道如何检索“ID”?在fragmentTransaction.replace 中使用。我对 Android 很陌生,但我仍然不确定如何做某些事情。提前谢谢你。

【问题讨论】:

  • @pskink 这正是我最初尝试做的事情,只需调用检索数据并将它们绑定到片段中的视图的代码。但我无法弄清楚为什么尽管使用了代码并且正确检索了新数据,但视图根本没有改变。所以,我想,我只需要以某种方式重新创建片段......

标签: android android-activity fragment onresume fragmenttransaction


【解决方案1】:

假设 FragmentA 由 ActivityA 启动。现在,从 FragmentA,您启动 ActivityB 您可以使用 startActivityForResult 启动 ActivityB 并在 FragmentA 内部方法中接收数据:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);
}

在这里,您可以根据需要更新 FragmentA。

【讨论】:

    【解决方案2】:

    这很酷,因为您创建了一个无限循环来创建新的FragmentA。我找不到图片来代表这一点,所以这是我能做的最好的:

    1. 创建并显示FragmentA
    2. FragmentA 变得可见时,它的onResume 被调用,因此创建另一个FragmentA
    3. 然后第二个FragmentA 变为可见并调用它的onResume,因此创建第三个FragmentA

    这个循环将永远持续下去,这可能是它冻结的原因。您希望使用startActivityForResult,就像@Victor Cao 解释的那样,这是他的答案,并且不要在这样的生命周期方法之一中创建任何活动或片段的新实例。

    作为新手,我还建议阅读有关 FragmentActivity 生命周期的文档,并熟悉它们的工作方式和调用时间,因为这是每个 Android 开发人员都需要了解的基础知识。

    【讨论】:

      【解决方案3】:

      我需要提到的第一件事是,更好地在片段中使用片段。 如果是这样,您可以将该片段替换为

      Fragment newFragment = new ExampleFragment();
      FragmentTransaction transaction = getFragmentManager().beginTransaction();
      
      // Replace whatever is in the fragment_container view with this fragment,
      // and add the transaction to the back stack if needed
      transaction.replace(R.id.fragment_container, newFragment);
      transaction.addToBackStack(null);
      
      // Commit the transaction
      transaction.commit();
      

      你将有一个容器来保存片段,你必须给它充气,并提供那个 id 来替换。

      那么如果你想使用activity本身,没问题,如果你在放置fragment的父activity的onResume()上写代码就可以了。

      请回答这个问题 How to start an Activity inside a Fragment class

      并参考这些网站 http://www.oodlestechnologies.com/blogs/Tabs-Activities-inside-Fragment-Activity

      【讨论】:

        【解决方案4】:

        只需更新FragmentAonResume()方法中的数据

        【讨论】:

        • 它不起作用。我试图在 onResume 中检索新数据,它确实重新检索它,但是尽管代码被正确调用,但视图中显示的值并没有改变。
        • 能否请您展示FragmentA的完整代码?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-13
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        • 2013-02-25
        相关资源
        最近更新 更多