片段变得可见时的侦听器

Posted

技术标签:

【中文标题】片段变得可见时的侦听器【英文标题】:Listener for when a Fragment becomes visible 【发布时间】:2013-05-11 18:06:43 【问题描述】:

试图让 optionsMenu 为不同的视图提供不同的选项,我快疯了。如果在我的片段上调用 ​​onResume(),我可以让它工作,但它不是。

我有一个 SherlockFragmentActivity,它在 onCreate 期间添加了一个像这样的 SherlockFragment:

if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) 
            Fragment f = LoginFragment.newInstance();

            getSupportFragmentManager()
                    .beginTransaction()
                    .add(android.R.id.content, f, "loginfragment")
                    .attach(f)
                    .commit();
        

这最终会使用相同的方法在其上添加另一个 SherlockFragment:

Fragment f = OfferListFragment.newInstance();
        getActivity().getSupportFragmentManager()
                .beginTransaction()
                .add(android.R.id.content, f, "offerList")
                .addToBackStack(f.getClass().getSimpleName())
                .commit();

最后这会使用以下方法在顶部启动另一个 SherlockFragment:

AddOfferFragment newFragment = AddOfferFragment.newInstance(offer);

        getActivity()
                .getSupportFragmentManager()
                .beginTransaction()
                .add(android.R.id.content, newFragment, "addofferdialog")
                .addToBackStack(newFragment.getClass().getSimpleName())
                .commit();

我已经像这样添加了 onResume() 事件:

@Override
    public void onResume() 
        Log.e(TAG, "onResume");
        super.onResume();
    

现在我完全看到了 onResume logs when they are created, but when I pressBackfrom any of them, I don't get theonResume` 日志。我的选择之一是注销,它会关闭所有这样的视图:

FragmentManager fm = getSupportFragmentManager();

        if (fm.getBackStackEntryCount() > 0) 
            fm.popBackStack(fm.getBackStackEntryAt(0).getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
        

但我什至没有在第一个片段上获得 onResume。

由于另一个问题,我遇到的片段是透明的here(这可能是正常行为,我不确定)。 我想知道我添加片段的方式是否错误?

如果不是,还有什么问题?

【问题讨论】:

不确定这是否会改变您的情况,但是 (1) 您不需要在 FragmentTransaction 中同时调用 add()attach()。只需add() 就足够了。 (2)当您将另一个片段“放在顶部”时,您的意思是您要尝试用新片段替换现有片段吗?在这种情况下,您应该在FragmentTransaction 中使用replace() 而不是add() 感谢您的评论。我将修改 1. 2,我将下一个片段全屏显示,我保留原始片段,以便用户可以单击返回以返回它们。这不是正确的做法吗? 我刚才对关于透明度的另一个问题有相同的答复,并且使用 .replace 而不是 .add 解决了我的所有问题。谢谢 我遇到了与 Darren onResume 在片段变得可见时没有被调用相同的问题。 . 对达伦问题的回答包括透明度和使用 .replace 代替 .add ***.com/questions/16575177/… 【参考方案1】:

正如 JonasSeputis 和 OP 本人所指出的,解决方案是将 transaction.add() 更改为 transaction.replace()

The detailed solution is here.

【讨论】:

以上是关于片段变得可见时的侦听器的主要内容,如果未能解决你的问题,请参考以下文章

片段变得可见时的监听器

如何知道 Fragment 何时变得不可见

使用动态组件和自定义事件时的 VueJS 警告

Selenium + Java 错误监听器 ext.js

从父片段到选项卡片段的接口侦听器不起作用

将数据从片段发送到活动,无需任何事件处理或侦听器