即使我在FragmentPagerAdapter

时间:2016-05-05 23:22:06

标签: android android-intent fragmentpageradapter startactivityforresult

我的Android应用程序中有这个导航架构:

  

PrimaryActivity(... ListView onClick - 通过发送< PrimaryUri> 通过   意图...)>
  MasterActivity(TabLayout,ViewPager,   FragmentPageAdapter)>
  FragmentA / FragmentB(... ListView onClick -   通过意图发送< PrimaryUri> + < DetailUri> ...)> DetailActivity。

现在,当我在 DetailActivity 中按BACK按钮时,MasterActivity会被破坏并再次使用片段A和B 和Intent数据的新实例重新创建(< PrimaryUri> )丢失

我尝试通过这种方式在Activies之间保持< PrimaryUri>

  • 覆盖MasterActivity中的onSaveInstanceState / onCreate(Bundle),但Bundle始终为null ,即使onSaveInstance保存数据
  • 使用getActivity()启动DetailActivity.startActivityForResult(...,在DetailActivity中设置resultIntent并调用setResult(OK,ResultCode> 0) 并在MasterActivity.onActivityResult中读取值... 但是 onActivityResult从未被称为
  • 使用startActivityForResult启动DetailActivity,... dtto ... FragmentB.onActivityResult ... 但onActivityResult永远不会 叫
  • 检查清单是否存在错误属性

现在我非常感谢有关问题的帮助:如何在我的应用中坚持< PrimaryUri> ?我更喜欢使用意图并解决这种奇怪的行为。一些论坛讨论了FragmentPageAdapter等中的错误......如果它是快速解决方案的话,我可能会重构它以使用SharedPreferences ......

编辑:其他一些信息:

在DetailActivity中:

@Override  
public void finish() {  
    Intent resultIntent = new Intent();  
    resultIntent.setData((Uri) getIntent().getParcelableExtra(FragmentB.MY_URI));  
    setResult(Activity.RESULT_OK, resultIntent);  
    super.finish();  
}  

在MasterActivity中我有:

@Override  public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);  
}

在FragmentB中我有:

public void onItemSelected(Uri contentUri) {      
    Intent intent = new Intent(getActivity(), DetailActivity.class);     
    intent.putExtra(PRIMARY_URI, mUri);...     
    startActivityForResult(intent, FragmentB.BACKTAG);  
} 

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {   
    super.onActivityResult(requestCode, resultCode, data);    
    switch (requestCode) {  
        case (FragmentB.BACKTAG): {  
            if (resultCode == Activity.RESULT_OK) {  
                mUri = data.get...  
            }  
        }  
        break;  
    }    
}  

奇怪的行为如下:

  1. 我在DetailActivity中按BACK按钮>
  2. 调用MasterActivity.onDestroy(为什么有?).. =
  3. 对FragmentB的WeakReference为null并且创建了新实例=
  4. 永远不会调用MasterActivity或FragmentB的onActivityResult。
  5. 我认为原因是onDestroy在等待onActivityResult时出现。但为什么要调用它以及为什么没有完全重新创建MasterActivity以捕获onActivityResult回调?

2 个答案:

答案 0 :(得分:1)

这很头疼,但here我在徒劳无功的2天后找到了解决办法。这与FragmentPageAdapter无关。我是幸运的女人!

答案 1 :(得分:0)

你在片段中调用startActivityForResult是吗?

对于要调用的片段中的onActivityResult,首先必须处理活动中的onActivityResult。打电话给超级。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

然后,您应该可以在片段的onActivityResult中处理它。