あるフラグメントAが別のフラグメントBに変更されるとonCreate()
、初期化を行うために他のいくつかの関数が呼び出されます。が変更された後、Fragment
現在のフラグメントの近くのフラグメントも初期化されます。例:5つのフラグメントA、B、C、D、Eがあります。現在のフラグメントはAです。Dに変更すると、CおよびEとともにDが初期化されます。私の問題は:
一部のコードは実行が非常に遅いため、すべてのデータではなく、一部のデータを初期化する必要があります。つまり、フラグメントが表示されている場合、一部のデータが初期化されます。現在のフラグメントでない場合、初期化は遅延します。ここに写真があります:
私はこれらのクラスを使用します:
android.widget.TabHost
android.support.v4.app.Fragment
android.support.v4.app.FragmentActivity
android.support.v4.app.FragmentPagerAdapter
android.support.v4.view.ViewPager
APIを読みましたが、フラグメントがVISIBLEの場合に呼び出されるメソッドがありません。だから、私はで何かをすることができると思いますonTabChanged
。しかし、コンテンツフラグメントを取得する方法がわかりませんTabHost
。可能であれば、自分の関数を呼び出して初期化を行います。
- フラグメントが非表示であるか、現在のフラグメントであるかをどのように知ることができますか?また
- 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);