当一个片段A更改为另一个片段B时,它将调用onCreate()
和其他一些函数来进行初始化。 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
获取内容片段。如果可以,那么我将调用我自己的函数进行初始化。
以下是一些代码:
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);
答案 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
}
}