2

あるフラグメント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。可能であれば、自分の関数を呼び出して初期化を行います。

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

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

1 に答える 1

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 
    }
}
于 2012-11-27T09:30:52.653 に答える