0

ユーザー向けのヒントを表示するためのフラグメントを作成しようとしています。フラグメントのcreateViewメソッドは、ViewPagerを返し、AsyncTaskを介してPagerAdapterをセットアップします。このフラグメントは、ユーザーがボタンを押すと、FragmentActivityに動的に追加されます。ユーザーが同じボタンをもう一度押す最後の項目に到達すると、このフラグメントはFragmentActivityから削除されます。android.R.id.contentによって識別されるFrameLayoutにフラグメントを追加することに注意することが重要です。

わかりました。初めてボタンを押すと、期待どおりに機能します。しかし、2回目にボタンを押すと、ViewPagerが表示されません。ビュー階層を使用して何が起こっているかを確認すると、ViewPagerが適切な場所に表示されますが、アイテムは表示されません。デバッグして、PagerAdapterのgetCount()が呼び出されていることを確認しましたが、getItemは呼び出されません。

これは私のフラグメントのcreateViewメソッドです:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
  View tipsView = inflater.inflate(R.layout.tip_manager_layout, container, false);
  this.tipPagerAdapter = new TipPagerAdapter(getFragmentManager(), getArguments().getIntArray(TIP_LAYOUT_IDS_KEY));
  this.viewPager = (ViewPager) tipsView.findViewById(R.id.tip_pager);
  this.viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {  
    @Override
    public void onPageSelected(int position) {
      if(position == (tipPagerAdapter.getCount()-1)){
         stop();
      }
    }

    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageScrollStateChanged(int state) {

    }
  });
  // Workaround to set the PagerAdapter within a fragment transaction
  new SetViewPagerAdapterTask().execute();
  return tipsView;
}

この方法でフラグメントを追加します。

FragmentTransaction fragmentTransaction = fragmentActivity.getSupportFragmentManager().beginTransaction();
fragmentTransaction.add(android.R.id.content, this, TAG);
fragmentTransaction.commit();

そして、この方法でフラグメントを削除します。

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.remove(tipManagerFragment);
fragmentTransaction.commit();

これは、フラグメントによって膨らんだレイアウトです。

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/tip_pager"
    android:layout_width="fill_parent"
    android:layout_height="175dp"
    android:layout_gravity="center_horizontal|bottom"
    android:paddingBottom="2dp" />

誰かがこの問題で私を助けることができますか?

編集:

しばらくの間、アクティビティにフラグメントを追加した後、フラグメントのshowメソッドとhideメソッドを使用しています。しかし、それは正しいアプローチではありません。ViewPagerでフラグメントを再度追加できない理由がわかりません。ViewPagerは正しく追加および削除されますが、2回目は、何も表示されません。

4

1 に答える 1

2

長い間私の問題について考えた後、私は次の考えを思いつきました。おそらく問題は、ViewPagerを持つフラグメントを削除しているという事実に関連していますが、ViewPagerで使用されているフラグメントは削除していません。次に、これらのフラグメントはFragmentManagerで続行され、新しいViewPagerがそれらを使用しようとすると、何か奇妙なことが起こります。

それで、私はすべての断片を削除しようとし始めました。これを行うために、FragmentPagerAdapterに次のようにメソッドを作成しました。

public void destroy(FragmentTransaction fragmentTransaction){
    for(Fragment tipFragment : tipFragments){
        fragmentTransaction.remove(tipFragment);
    }
}

アダプタは、tipFragmentsを使用してコンテンツを作成しています。したがって、パラメータとしてfragmentTransactionを取得し、これらのフラグメントをすべて削除します。フラグメントを削除したい場合は、次のコードを使用します。

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
tipPagerAdapter.destroy(fragmentTransaction);
fragmentTransaction.remove(TipManagerFragment.this);
fragmentTransaction.commit();

このようにして、すべてのフラグメントを削除し、ViewPagerを持つフラグメントを再度追加すると、すべてが正常に機能します。

于 2012-10-21T21:12:22.293 に答える