【问题标题】:ViewPager isn't loading the items after removed and re-added into FrameLayoutViewPager 在删除并重新添加到 FrameLayout 后未加载项目
【发布时间】:2012-10-02 00:49:52
【问题描述】:

我正在尝试制作一个片段来为用户显示提示。片段的 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 已正确添加和删除,但第二次它根本不显示任何内容。

【问题讨论】:

    标签: android android-layout android-fragments android-viewpager android-framelayout


    【解决方案1】:

    想了很久我的问题,我有了以下想法:可能问题与我移除了有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 的片段时,一切正常。

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      相关资源
      最近更新 更多