我正在尝试创建一个片段来显示用户的提示。片段的createView方法返回一个ViewPager并通过AsyncTask设置PagerAdapter。当用户按下按钮时,该片段在FragmentActivity中以dinamically方式添加。如果用户再次按下相同的按钮,则会从FragmentActivity中删除该片段。重要的是要注意我将片段添加到由android.R.id.content识别的FrameLayout。
好的,我第一次按下按钮时,按预期工作。但是第二次按下按钮时,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被正确添加和删除,但第二次,它根本没有显示任何内容。
答案 0 :(得分: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的片段时,一切运行良好。