0

我正在尝试制作一个片段来为用户显示提示。片段的 createView 方法返回一个 ViewPager 并通过 AsyncTask 设置 PagerAdapter。当用户按下按钮时,这个片段会动态地添加到 FragmentActivity 中。如果用户再次按下相同按钮到达最后一项,则从 FragmentActivity 中删除该片段。需要注意的是,我将片段添加到由 android.R.id.content 标识的 FrameLayout 中。

好的,我第一次按下按钮时,它按预期工作。但是我第二次按下按钮时,ViewPager 没有出现。当我使用 View Hierarchy 查看发生了什么时,我在正确的位置看到 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" />

有人可以帮我解决这个问题吗?

编辑:

有一段时间,我在将片段添加到活动后使用它的显示和隐藏方法。但这不是正确的方法。我不明白为什么我不能用 ViewPager 再次添加片段。ViewPager 已正确添加和删除,但第二次,它根本不显示任何内容。

4

1 回答 1

2

想了很久我的问题,我有了以下想法:可能问题与我移除了有ViewPager的fragment有关,但是我没有移除ViewPager使用的fragment。然后,这些片段在 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 回答