2016-09-14 73 views
3

我已經搜索了關於如何替換viewPager中片段的其他答案,但無濟於事。在ViewPager中替換片段 - 獲取NPE

設置是通常的,我有2個片段。

[片段1] [Fragment2]

操作欄中我有在覆蓋模式(谷歌搜索)開始一個新的意圖的搜索按鈕,然後在onActivityResult我想用新片段替換當前片段。

我有SearchFragment完成,它的工作原理如果我將它作爲第三個片段添加到選項卡中。不過,我只想用新的搜索片段替換Fragment2。

我有一個可以幫助的sectionsPagerAdapter類。

所以,當我點擊搜索按鈕的動作條我)這個代碼在onActivityResult(射擊

SearchFragment searchFragment = new SearchFragment(); 
    FragmentManager fm = getSupportFragmentManager(); 
    fm.beginTransaction().replace(R.id.container, searchFragment) 
         .addToBackStack(null) 
         .commit(); 

但是用錯誤的應用程序崩潰:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { (has extras) }} to activity {com.example.app/com.example.MainActivityTabs}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState 

at com.example.MainActivityTabs.onActivityResult(MainActivityTabs.java:168) 

168是.commit( );

如果按下按鈕時我有片段事務觸發,它至少不會崩潰,但會清除分頁器中的兩個片段。所以我認爲那裏有兩個問題。

感謝

+0

添加您的查看尋呼機和適配器代碼 – USKMobility

+0

p在'onactivityResult()'中使用你的完整代碼 –

+0

'使用一些視圖或處理程序來發布可運行程序,並在該可運行的程序中執行該任務。像:'new Handler()。post(new Runnable(){});' –

回答

0

我經歷同樣的問題來了,如果你在一個onActivityResult()

犯片段它不會工作,但你可以通過

boolean replaceFragment=false; 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     replaceFragment = true; 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    if (replaceFragment) { 
     replaceFragment = false; 
     //do your fragment transaction in handler with some time 
     new Handler().postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        //Do your fragment transaction here 
       } 
     }, 500); 
    } 
} 

實現這一目標更多關於片段交易和錯誤見 https://medium.com/@bherbst/the-many-flavors-of-commit-186608a015b1#.9gnzh4wqi

+0

謝謝,是來自onResume的致電完成了這項工作。 –