在Android中使用Fragment时延迟初始化

时间:2012-11-27 08:48:34

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

当一个片段A更改为另一个片段B时,它将调用onCreate()和其他一些函数来进行初始化。 Fragment发生变化后,当前片段附近的片段也将被初始化。例如:我有5个片段A,B,C,D,E。当前片段是A.当我改为D时,D和C以及E将被初始化。我的问题是:

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

enter image description here

我使用这些类:

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. 延迟初始化的其他方法。
  4. 以下是一些代码:

        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);
            }
        }
    

    MainActivity: / **这些代码是创建片段* /

            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);
    

1 个答案:

答案 0 :(得分: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 
    }
}