Activity 向后导航时崩溃
Activity crashes while navigating back
全部,
我正在 3 个相互依赖的屏幕之间执行导航。
Activity A 有一个 table 列表 table 行。每行都有 onclick 侦听器事件,其中从 table 行获取数据并传递到下一个屏幕 Activity B.
Activity B 从 Intent 中读取数据,获取相应的图片数据等,构建布局。它有一个按钮,从编辑文本中读取数据并传递给 Activity C.
Activity C 也根据 Intent 中的数据构建布局。
我通过清单文件中的 Parent activity 配置实现了这些活动之间的导航。
现在,当我在 Activity C 中向后导航到 Activity B 时,它崩溃了,因为它无法从 Intent 中找到数据,因为控件来自 Child 到 Parent 而不是 Parent 到 Child.
我了解到 Activity B 的 onCreate 函数正在再次执行。所以我在 Activity B 中保留了 onPause() 和 onResume() 方法来保持 re-execution。但是运气不好。
有人可以建议如何处理这种情况。
编辑:
Activity乙:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_activity);
getActionBar().setDisplayHomeAsUpEnabled(true);
source_activity = this.getIntent().getStringExtra("source_activity");
Bundle b = this.getIntent().getExtras();
if(b!=null)
DashBoardDisplay_l = b.getParcelable("obj");
Name_ref=DashBoardDisplay_l.getName();
}
Activity C:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.activity_open_translate,R.anim.activity_close_scale);
setContentView(R.layout.point_log_activity);
Intent intent = getIntent();
String YourtransferredData = intent.getExtras().getString("ref_name");
Log.d(TAG, "ref name "+YourtransferredData);
Name=YourtransferredData;
Log.d(TAG, "name value "+Name);
getActionBar().setDisplayHomeAsUpEnabled(true);
new BackEndJob().execute();
}
Activity B 包含一些来自先前屏幕 Activity A 的 Intent。因此,当从 Activity C 返回到 Activity B 时,它找不到来自 Intent 的数据导致空指针异常。
那么是否有任何选项可以显示后退导航堆栈中的内容,而不是使用 Dalija 建议的 Savedinstance 重新创建它。
根据您的描述,似乎应该阻止向后导航到 Activity B。因此,当用户在 Activity C 中按下后退按钮时,它将返回到 Activity A。如果是这种情况,那么当它把控制权传递给 [=27= 时,你应该完成 Activity B ] C.
...
this.startActivity(intent); // start Activity C
finish();
}
完成 activity 将从导航堆栈中删除 Activity B 并完全销毁 Activity B 解决您的后退导航问题。
但是,如果您确实想导航回 Activity B,那么您应该在 Activity B 中使用 onSaveInstanceState()
和 onRestoreInstanceState()
来保存其状态。
当您启动 Activity C 时,Activity B 会停止。届时,如果需要清理资源,系统可能会决定随时销毁 Activity B。您对该过程没有任何影响,也无法阻止它。
您可以在 Activity Lifecycle
中找到更多信息
全部,
我正在 3 个相互依赖的屏幕之间执行导航。
Activity A 有一个 table 列表 table 行。每行都有 onclick 侦听器事件,其中从 table 行获取数据并传递到下一个屏幕 Activity B.
Activity B 从 Intent 中读取数据,获取相应的图片数据等,构建布局。它有一个按钮,从编辑文本中读取数据并传递给 Activity C.
Activity C 也根据 Intent 中的数据构建布局。
我通过清单文件中的 Parent activity 配置实现了这些活动之间的导航。
现在,当我在 Activity C 中向后导航到 Activity B 时,它崩溃了,因为它无法从 Intent 中找到数据,因为控件来自 Child 到 Parent 而不是 Parent 到 Child.
我了解到 Activity B 的 onCreate 函数正在再次执行。所以我在 Activity B 中保留了 onPause() 和 onResume() 方法来保持 re-execution。但是运气不好。
有人可以建议如何处理这种情况。
编辑:
Activity乙:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.edit_activity);
getActionBar().setDisplayHomeAsUpEnabled(true);
source_activity = this.getIntent().getStringExtra("source_activity");
Bundle b = this.getIntent().getExtras();
if(b!=null)
DashBoardDisplay_l = b.getParcelable("obj");
Name_ref=DashBoardDisplay_l.getName();
}
Activity C:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
overridePendingTransition(R.anim.activity_open_translate,R.anim.activity_close_scale);
setContentView(R.layout.point_log_activity);
Intent intent = getIntent();
String YourtransferredData = intent.getExtras().getString("ref_name");
Log.d(TAG, "ref name "+YourtransferredData);
Name=YourtransferredData;
Log.d(TAG, "name value "+Name);
getActionBar().setDisplayHomeAsUpEnabled(true);
new BackEndJob().execute();
}
Activity B 包含一些来自先前屏幕 Activity A 的 Intent。因此,当从 Activity C 返回到 Activity B 时,它找不到来自 Intent 的数据导致空指针异常。
那么是否有任何选项可以显示后退导航堆栈中的内容,而不是使用 Dalija 建议的 Savedinstance 重新创建它。
根据您的描述,似乎应该阻止向后导航到 Activity B。因此,当用户在 Activity C 中按下后退按钮时,它将返回到 Activity A。如果是这种情况,那么当它把控制权传递给 [=27= 时,你应该完成 Activity B ] C.
...
this.startActivity(intent); // start Activity C
finish();
}
完成 activity 将从导航堆栈中删除 Activity B 并完全销毁 Activity B 解决您的后退导航问题。
但是,如果您确实想导航回 Activity B,那么您应该在 Activity B 中使用 onSaveInstanceState()
和 onRestoreInstanceState()
来保存其状态。
当您启动 Activity C 时,Activity B 会停止。届时,如果需要清理资源,系统可能会决定随时销毁 Activity B。您对该过程没有任何影响,也无法阻止它。
您可以在 Activity Lifecycle
中找到更多信息