gpt4 book ai didi

android - Android中使用Fragment时延迟初始化

转载 作者:行者123 更新时间:2023-11-29 01:59:06 24 4
gpt4 key购买 nike

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

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

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,但当 fragment 可见时没有调用任何方法。所以,我想我可以用 onTabChanged 做点什么。但是我不知道如何通过TabHost获取内容 fragment 。如果可以的话,我会调用自己的函数来初始化。

  1. 我怎么知道 fragment 是隐藏的还是当前 fragment ?或者
  2. 我可以在 TabHost 中获取内容 fragment 吗?或者
  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);
}
}

主要 Activity :/** 这些代码是创建 fragment */

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

/** 这段代码是将 fragment 放入TabHost */

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

最佳答案

My Problem Is: some codes are very slow so I want to initialize a part of the datas instead of ALL of them.

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

How can I know the fragment is hide or its the current one? OR Can I get the content fragment in TabHost? OR Other ways to delay the initialization.

您可以使用有关 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
}
}

关于android - Android中使用Fragment时延迟初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13580369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com