2017-04-22 66 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()調用