1

私の問題は、最初にフラグメントを直接ロードすることです。また、メソッドフラグメントを呼び出したいのですが、ユーザーに表示されます。

正しいフラグメントをロードするために、で使用viewPager.setCurrentItem()onCreateます。それはうまくいきます。

FragmentActivity code

public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    mTabsAdapter = new TabsPlayerAdapter(this, mRadioList);
    mMainViewPager.setAdapter(mTabsAdapter);
    mMainViewPager.setOnPageChangeListener(this);
    mMainViewPager.setCurrentItem(2);
}

フラグメントCurrentと呼ばれるメソッドには、を使用しonPageSelected viewPagerます。それはうまくいきます。

FragmentActivity code

@Override
public void onPageSelected(int position) {
    Log.d(TAG, "onPageSelected - position: " + position);
    ((PlayerFragment) mTabsAdapter.mSparseFragment.get(position))
                                  .startAnnimation();
}

FragmentStatePagerAdapter code:

@Override
public Fragment getItem(final int position) {
    Log.d(TAG, "getItem - position: " + position);
    Bundle args = new Bundle();  
        args.putString("num", mRadioModel.get(position).name);
        mSparseFragment.put(position, Fragment.instantiate  
                    (mContext,PlayerFragment.class.getName(), args));
        return mSparseFragment.get(position);
}

FragmentStatePagerAdapter code :

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    super.destroyItem(container, position, object);
    Log.d(TAG, "destroyItem - position: " + position);
    mSparseFragment.remove(position);
}

私はこれら2つのことを別々に行うことができます。しかし、この2つを一緒に使用しようとすると、"NullPointerException"自分のを呼び出すときに時間がありますfragment
私はそれが私onPageSelectedの前に呼ばれているのを見ました。getItemAdapter

4

3 に答える 3

2

非常に簡単な回避策があります。

アダプターに次のように記述します。

public static interface FirstShot
{
    public void onFirstShot();
}


private FirstShot firstShot;
private boolean shot = false;

@Override
public Fragment getItem(int arg0)
{
    if (!shot && firstShot != null)
    {
        shot = true;
        firstShot.onFirstShot();
    }

    // your code here
}

アクティビティに FirstShot を実装します。

@Override
public void onFirstShot()
{
    viewPager.post(new Runnable()
    {
        @Override
        public void run()
        {
            boolean needNotify = false;
            if (pager.getCurrentItem() == position) needNotify = true;
            viewPager.setCurrentItem(position, false);
            if (needNotify) onPageSelected(position);
        }
    });
}

onPageSelected() が呼び出されるようになりました!

于 2012-09-09T20:06:30.053 に答える
1

onAttachedToWindow が呼び出されると、項目が使用可能であることがわかります。setCurrentItem を呼び出した時点では、アダプターはまだビューの作成に使用されていません。(setAdapter は、すべてが膨張したことを知るのに十分ではありません)

それ以外の場合は、currentItem を設定した後にリスナーを設定することを検討できます。したがって、フラグメントを開くときにアニメーションが表示されません。

于 2012-08-22T09:56:59.863 に答える
0

getItem を作成する前にまだ onPageSelected を呼び出していたため、受け入れられた解決策はうまくいきませんでした。

私はそれを次のように修正しました:

public class MyAdapter extends FragmentPagerAdapter {

    ...
    ...

    @Override
    public Fragment getItem(int position) {
        Fragment fragment = createdFragments.get(position);
        if (fragment != null) {
            return fragment;
        }

        fragment = createNewFragment();
        createdFragments.put(position, fragment);

        return fragment;
    }

    public TabFragment getFragment(int position) {
        TabFragment fragment = createdFragments.get(position);
        if (fragment == null) {
            fragment = (TabFragment) getItem(position);
        }
        return fragment;
    }
}

そして、adapter.getFragment()コードでフラグメントを取得するために使用し、null 値を取得することはありません。

于 2015-07-08T08:17:46.783 に答える