2016-09-14 83 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的致电完成了这项工作。 –