片段onResume来自后栈

ori*_*rel 93 compatibility android android-fragments android-3.0-honeycomb back-stack

我正在使用兼容包来使用Android 2.2中的Fragments.当使用片段,并在它们之间添加转换到backstack时,我想实现一个活动的onResume的相同行为,即,在弹出一个片段到达"前景"(用户可见)之后backstack,我想在片段中激活某种回调(例如,对共享UI资源执行某些更改).

我看到片段框架中没有内置回调.为了达到这个目的,有没有好的做法?

ori*_*rel 111

由于缺乏更好的解决方案,我得到了这个为我工作:假设我有1个活动(MyActivity)和几个相互替换的片段(一次只能看到一个).

在MyActivity中,添加此侦听器:

getSupportFragmentManager().addOnBackStackChangedListener(getListener());
Run Code Online (Sandbox Code Playgroud)

(如您所见,我正在使用兼容包).

getListener实现:

private OnBackStackChangedListener getListener()
    {
        OnBackStackChangedListener result = new OnBackStackChangedListener()
        {
            public void onBackStackChanged() 
            {                   
                FragmentManager manager = getSupportFragmentManager();

                if (manager != null)
                {
                    MyFragment currFrag = (MyFragment) manager.findFragmentById(R.id.fragmentItem);

                    currFrag.onFragmentResume();
                }                   
            }
        };

        return result;
    }
Run Code Online (Sandbox Code Playgroud)

MyFragment.onFragmentResume()将在按下"后退"后调用.但有几点需要注意:

  1. 它假设您将所有事务添加到backstack(使用 FragmentTransaction.addToBackStack())
  2. 它将在每次堆栈更改时激活(您可以将其他内容存储在后端堆栈中,例如动画),这样您就可以获得同一个片段实例的多次调用.

  • 根据您查询的片段ID,它是如何工作的?每个片段有什么不同,后面的堆栈中找到了正确的片段? (7认同)
  • 如果它适合你,你应该接受你自己的答案是正确的. (3认同)
  • 不调用onResume() (3认同)
  • @Warpzit没有调用该方法,并且android文档悄悄地承认它永远不会被调用(它只在活动恢复时被调用 - 如果该活动已经激活,则永远不会被调用) (2认同)
  • 荒谬的是我们必须这样做!但很高兴其他人能够找到这个"功能" (2认同)

Bro*_*o25 33

我已经改变了建议的解决方案.对我来说效果更好:

private OnBackStackChangedListener getListener() {
    OnBackStackChangedListener result = new OnBackStackChangedListener() {
        public void onBackStackChanged() {
            FragmentManager manager = getSupportFragmentManager();
            if (manager != null) {
                int backStackEntryCount = manager.getBackStackEntryCount();
                if (backStackEntryCount == 0) {
                    finish();
                }
                Fragment fragment = manager.getFragments()
                                           .get(backStackEntryCount - 1);
                fragment.onResume();
            }
        }
    };
    return result;
}
Run Code Online (Sandbox Code Playgroud)

  • 在SupportFragmentManager中没有名为`getFragments()`的方法的记录...... -1: - / (9认同)
  • 我的解决方案和之前的解决方案之间的区别在于,在每个片段更改(如在片段堆中添加,替换或向后)时,将调用顶部片段的"onResume"方法.此方法中没有硬编码的片段ID.基本上它会在每次更改时在您看到的片段中调用onResume(),无论它是否已经加载到内存中. (2认同)

use*_*304 5

之后,popStackBack()您可以使用以下回调:onHiddenChanged(boolean hidden)在您的片段中

  • 这似乎不适用于应用程序兼容片段。 (2认同)