嵌套ViewPager在按下返回键时会导致内容空白

3
我有一个奇怪的UI问题。简而言之,我在一个片段(称为“ A”)中放置了一个ViewPager。到此为止,在ViewPager中显示片段没有问题。
问题出现在我按下返回按钮时。返回按钮可以很好地弹出片段A并返回到上一个片段,但是在此过渡期间,ViewPager的内容完全被清空。
这非常明显,因为我有过渡动画。我不知道为什么会发生这种情况。很明显,这与嵌套片段有关,因为只有在具有嵌套片段的特定屏幕上才会发生这种情况。
代码片段:
初始片段显示项目列表。我们单击其中一个项目...
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
    FragmentManager fm = getFragmentManager();
    Fragment f = fm.findFragmentByTag("some_tag_name");
    if(f == null) {
        f = SomFragment.newInstance(...);
    }  

    getFragmentManager()
            .beginTransaction()
            .setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left,
                                 R.anim.slide_in_left, R.anim.slide_out_right)
            .replace(R.id.frame, f)
            .addToBackStack(null)
            .commit();
}

现在,一个新的片段出现了,并带有一个ViewPager。ViewPager被初始化...
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {    
    mPager = (ViewPager) view.findViewById(R.id.viewpager);
    mPagerAdapter = new SomeAdapter(getChildFragmentManager());
    mPager.setAdapter(mPagerAdapter);    
}

我没有在父Activity中重写onBackPressed或进行其他有趣的操作。这很简单明了。


嵌套片段的行为方式很奇怪,官方只支持 Android 版本 17 及以上。因此,我建议不要采用这种方法,尽量找到不实现嵌套片段的解决方案。至于您的具体问题,提供几行代码将有助于分析为什么会发生这种情况。 - Sam
@SamarthJain -- 这段代码非常简单,但我还是会把它包含在内。 - Alex Fu
可能是重复的问题:转场动画期间嵌套片段消失 - user
@AlexFu 你是如何解决这个问题的? - Harish
@Harish 我想我最终选择了这个 - https://dev59.com/GWUp5IYBdhLWcg3w-Laz#22673871 - Alex Fu
@AlexFu 在 vaiepager 适配器中,你传递了什么?你提供的链接对我来说没有用。 - Harish
2个回答

0
你需要重写onResume()方法,并在其中重新初始化你的UI。
@Override
 public void onActivityCreated(Bundle savedInstanceState) {
         super.onActivityCreated(savedInstanceState);
         initialize();
}

private void initialize(){
      btnOne= (Button) getActivity().findViewById(R.id.btnOne);
      btnTwo = (Button) getActivity().findViewById(R.id.btnTwo);      

      btnOne.setOnClickListener(this);
      btnTwo.setOnClickListener(this);    

      viewPager = (ViewPager) getActivity().findViewById(R.id.viewPager);
      viewPager.setAdapter(new ViewPagerAdapter(getActivity().getSupportFragmentManager()));

}

@Override
public void onResume() {
    super.onResume();
    initialize();
}

0

使用onCreateView()(不要使用onViewCreated()):

 @Override
 public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
   View rootView = inflater.inflate(R.layout.pager, container, false);                                                   

   mPager = (ViewPager)rootView.findViewById(R.id.viewpager);
   mPagerAdapter = new SomeAdapter(getChildFragmentManager());
   mPager.setAdapter(mPagerAdapter); 
   return rootView;   
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接