首页 文章

碎片尚未附加?

提问于
浏览
16

以下是我的代码 . 我想要实现的是我在Recycler视图中显示viewholder . 内部视图寻呼机我正在显示一个片段,在向左滑动我正在显示另一个片段 . 但是当我运行应用程序时 . 应用程序崩溃 . 不知道我哪里出错了 . 我认为这是片段概念的一部分 . 请帮帮我

@Override
 public void onBindViewHolder(ManageCustomerViewHolder holder, int position) 
 {
     holder.viewPager.setAdapter(new MyPageAdapter(fragmentManager, fragments));
 }

 private List<Fragment> getFragments() 
 {
     List<Fragment> fList = new ArrayList<Fragment>();
     fList.add(MyFragment.newInstance("Fragment 1"));
     fList.add(Myfragment1.newInstance("Fragment 2"));

     return fList;
 }

 public class ManageCustomerViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
 {
    ViewPager viewPager;
    viewPager = (ViewPager) itemView.findViewById(R.id.viewpager);

    itemView.setOnClickListener(this);
 }

这就是错误:

java.lang.IllegalStateException:片段尚未附加 .

4 回答

  • 19

    我的应用程序中遇到了同样的问题 .

    堆栈跟踪:

    java.lang.IllegalStateException: Fragment has not been attached yet. android.support.v4.app.Fragment.instantiateChildFragmentManager(Fragment.java:2154)
    android.support.v4.app.Fragment.getChildFragmentManager(Fragment.java:704)
    

    该应用程序崩溃在这一行:

    function performSomeActionInChildFragments() {
        List<Fragment> fragments = getChildFragmentManager().getFragments();
        ...
    }
    

    当片段不再附加到其父活动/片段时会发生这种情况 . 因此,一个简单的 isAdded() 检查应该为您解决此问题 .

    Fix:

    function performSomeActionInChildFragments() {
        if (!isAdded()) return;
        List<Fragment> fragments = getChildFragmentManager().getFragments();
        ...
    }
    

    来自documentation

    isAdded() - 如果片段当前已添加到其活动中,则返回true .

  • 11

    将支持库修订更新到27.0.2以解决问题 . 见changelog .

  • 1

    我今天遇到了这个例外 . 在寻找答案后,我注意到所有这些都与ViewPager和getFragmentManger()或我的案例getChildFragmentManager()有关 .

    好吧,有时这种情况会发生在没有碎片的情况下,因此无法附加或显示任何内容 . 因此,当我的片段被创建时,我现在将片段管理器保存在一个变量中,然后我在我的Viewpager实例中使用该管理器,这样总是会保存在类中的管理器 . 为了澄清我在这里说的是我的代码:

    之前

    ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());
        adapter.addFragment(tabLlegadaFragment, "Llegada");
        adapter.addFragment(tabIngresoFragment, "Ingreso");
        viewPager.setAdapter(adapter);
    

    在这里我遇到了错误,因为我用一些方法重新创建了视图,我也按了后退按钮 . 所以当发生这种情况时,Android正在从片段中寻找一个不再存在或已经消失的getChildFragmentManager()(因为我按了后退按钮)

    现在

    FragmentManager                 childFragMang;
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    
           View view = inflater.inflate(R.layout.fragment_tab_main, container, false);
           ..
           childFragMang= getChildFragmentManager();
           ..
           return view;
    
        }
    

    当我打电话给Viewpager时,我会使用那个经理

    ViewPagerAdapter adapter = new ViewPagerAdapter(childFragMang);
        adapter.addFragment(tabLlegadaFragment, "Llegada");
        adapter.addFragment(tabIngresoFragment, "Ingreso");
        viewPager.setAdapter(adapter);
    

    我没有再次面对那个例外,因为当我按下并且没有getChildFragmentManager()调用时,我的片段已经消失了

  • 0

    您不应该尝试实例化片段 . 片段已创建并具有由Android系统控制的生命周期 . 您可以通过重写回调方法来响应生命周期事件,例如 onAttached (当片段附加到 Activity 时调用)

相关问题