即使我在FragmentPagerAdapter中尝试startActivityForResult,saveInstanceState,在BACK按钮上的意图也会丢失

问题描述 投票:2回答:2

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

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

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

我通过这种方式在活动之间尝试了持久的<Primary Uri>:

  • 在MasterActivity中覆盖onSaveInstanceState / onCreate(Bundle),但即使onSaveInstance保存数据,Bundle始终为null
  • 使用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。

我认为原因是onDestroy在等待onActivityResult时出现。但为什么要调用它以及为什么没有完全重新创建MasterActivity以捕获onActivityResult回调?

android android-intent fragmentpageradapter startactivityforresult
2个回答
1
投票

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


0
投票

你在片段中调用startActivityForResult是吗?

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.