2017-04-22 58 views
4

以下是我的代码。我想实现的是,我在我的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:片段尚未连接。

+0

你可以发布'getFragments()'被调用的地方吗? –

回答

0

你不应该试图实例片段。片段被创建并且具有由Android系统控制的生命周期。您通过覆盖回调方法来响应生命周期事件,如onAttached(当片段连接到它的Activity时调用)

+0

阅读此https://gunhansancar.com/best-practice-to-instantiate-fragments-with-arguments-in-android/ –

7

我在我的应用程序中面临同样的问题。

堆栈跟踪:

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()检查应该可以为您解决此问题。

修复:

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

documentation

isAdded() - 如果片段正在加入到它的活动返回true。

+0

这工作,当我有一个片段和它内的DialogFragment时,返回时归零这从另一个片段。但我有点困惑,为什么返回!isAdded()return;如果childFragmentManager仍然为空,允许执行其余代码并且不会崩溃?或者,该方法不允许getChildFragmentManager不为null? –

+0

@AdamGardner如果您检查isAdded()的android源代码,您会在内部看到它是否检查childFragmentManager是否为null,如果为null,那么isAdded为false。因此,我们提前返回并且不需要显式空检查getChildFragmentManager() –

7

更新支持库修订27.0.2来解决这个问题。见changelog

+0

您可以添加问题的根本原因吗?谢谢! – Allan

+0

这是正确的答案,另请参阅原始错误https://issuetracker.google.com/issues/67795222 –

0

我今天面对此异常。寻找答案后,我发现所有与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); 

我没有再面对异常如此,这是因为我的片段已经dissapeared当我回压,并且没有getChildFragmentManager()调用