【问题标题】:Delay initialization when using Fragment in Android在 Android 中使用 Fragment 时延迟初始化
【发布时间】:2012-11-14 20:18:10
【问题描述】:

当一个fragment A变为另一个fragment B时,会调用onCreate()等一些函数进行初始化。在Fragment 改变后,当前fragment 附近的fragment 也会被初始化。例如:我有5个片段A、B、C、D、E。当前的片段是A。当我更改为D时,D连同C和E将被初始化。我的问题是:

有些代码执行起来很慢,所以我想初始化部分数据而不是所有数据。也就是说,当片段可见时,会初始化一些数据。当它不是当前片段时,初始化将被延迟。这是一张图片:

我使用这些类:

android.widget.TabHost
android.support.v4.app.Fragment
android.support.v4.app.FragmentActivity
android.support.v4.app.FragmentPagerAdapter
android.support.v4.view.ViewPager

我阅读了 API,但是当片段可见时没有调用任何方法。所以,我想我可以用onTabChanged 做点什么。但是我不知道如何通过TabHost获取内容片段。如果可以的话,我会调用自己的函数进行初始化。

  1. 我如何知道片段是隐藏的还是当前片段?或者
  2. 能否在 TabHost 中获取内容片段?或者
  3. 其他延迟初始化的方法。

这里有一些代码:

    public class TabsAdapter extends FragmentPagerAdapter
          implements TabHost.OnTabChangeListener,
                     ViewPager.OnPageChangeListener{
        private final Context mContext;
        private final TabHost mTabHost;
        private final ViewPager mViewPager;
        private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>();

        private static final class TabInfo {
            private final Class<?> mClss;
            private final Bundle mArgs;

            TabInfo(String _tag, Class<?> _class, Bundle _args) {
                mClss = _class;
                mArgs = _args;
            }
        }
        public TabsAdapter(FragmentActivity activity, TabHost tabHost,     ViewPager pager) {
            super(activity.getSupportFragmentManager());
            mContext = activity;
            mTabHost = tabHost;
            mViewPager = pager;
            mTabHost.setOnTabChangedListener(this);
            mViewPager.setAdapter(this);
            mViewPager.setOnPageChangeListener(this);
        }

        /** MainActivity call this func to add tabs */
        public void addTab(TabHost.TabSpec tabSpec, Class<?> clss, Bundle args) {
            some code
        }

        public void onPageSelected(int position) {
            TabWidget widget = mTabHost.getTabWidget();
            int oldFocusability = widget.getDescendantFocusability();
            widget.setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
            mTabHost.setCurrentTab(position);
            widget.setDescendantFocusability(oldFocusability);
            Log.i("demo tab","onPageSelected tab change to---------   " + position);
        }
    }

主要活动: /** 这些代码是创建片段 */

        FrameLayout tabContact = (FrameLayout) LayoutInflater.from(this).inflate(R.layout.tab_widget, null);
        ImageView imgBackContact = (ImageView) tabContact.findViewById(R.id.tab_widget_back_image);
        ImageView imgFrontContact = (ImageView) tabContact.findViewById(R.id.tab_widget_front_image);
        imgBackContact.setImageResource(R.drawable.ic_tab_contact_normal);
        imgFrontContact.setImageResource(R.drawable.ic_tab_contact_selected);

/**这些代码是把片段放入TabHost */

mTabsAdapter.addTab(mTabHost.newTabSpec(XXX), A.class, null);

【问题讨论】:

    标签: android android-fragments android-tabhost android-tabs


    【解决方案1】:

    我的问题是:有些代码很慢,所以我想初始化一个部分 数据而不是所有数据。

    我希望您不要在主 UI 线程上执行繁重的操作。

    我如何知道片段是隐藏的还是当前片段?或者我可以 获取 TabHost 中的内容片段?或 其他延迟 初始化。

    您可以使用关于FragmentPagerAdapter 的技巧。在您的 onPageSelected 方法中,您可以找出当前的 Fragment 并对其调用初始化方法:

    public void onPageSelected(int position) {
        //...
        Fragment item = getSupportFragmentManager().findFragmentByTag("android:switcher:" + R.id.theIdOfTheViewPager + ":" + position);
        if (item != null && item.getView() != null) {
            item.initializeStuffForThisFragment();// you need to cast it to your Fragment class 
        }
    }
    

    【讨论】:

    • 看到你的回答后,我使用 getItem(position): BaseFragment f = (BaseFragment) getItem(position); f.onLoad();我成功地完成了这些事情。但是还有一个问题,我稍后再发给你。 @Luksprog
    猜你喜欢
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2020-10-08
    • 2017-11-11
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多