我有3项活动
第一个活动调用第二个活动,第二个活动调用第三个活动。
第二个活动使用第一个活动的意图附加内容。
因此,当我从第3个活动返回(使用操作栏后退按钮)第2个活动时,我在我提取额外意图的地方得到了nullpointerexception。注意:如果按下导航栏后退按钮,则不会发生这种情况。
在按下操作栏后退按钮时,它正在重新启动活动,因此没有意图。
在按导航栏后退按钮时,它正在恢复片段,因此我可以显示我的可分配数据。
有关如何保存意图附加物的任何线索? 我认为一种解决方法是将其保存为共享偏好,但我想知道这样做的最佳实践。
编辑:添加代码
来自活动1的片段。
Intent intent = new Intent(getActivity(), TopTenTracksActivity.class)
.putExtra(Intent.EXTRA_TEXT, new String[]{artistId, artistName});
startActivity(intent);
获取活动2片段的意图
String[] artistInfo = getActivity().getIntent().getExtras().getStringArray(Intent.EXTRA_TEXT);
在上面获取空指针错误。
错误日志
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String[] android.os.Bundle.getStringArray(java.lang.String)' on a null object reference
at com.plusgaurav.spotifystreamer.TopTenTracksActivityFragment.onCreateView(TopTenTracksActivityFragment.java:62)
修改 这是我的以下代码:
public class TopTenTracksActivity extends AppCompatActivity {
public static String[] artistInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
artistInfo = savedInstanceState.getStringArray("savedArtistInfo");
} else {
// get intent info
artistInfo = getIntent().getExtras().getStringArray(Intent.EXTRA_TEXT);
}
setContentView(R.layout.activity_top_ten_tracks);
// set subtitle in the actionbar
android.support.v7.app.ActionBar actionBar = getSupportActionBar();
assert actionBar != null;
actionBar.setSubtitle(artistInfo[1]);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save intent
outState.putStringArray("savedArtistInfo", artistInfo);
}
它仍然会进入上面提到的else循环。我的问题是当我按下ActionBar时,为什么savedInstanceState为null。
答案 0 :(得分:3)
ActionBar
后退实际上是“向上”按钮。它与设备后退按钮的区别在于,“向上”按钮意味着在屏幕层次结构中上升(返回到父活动的实例),而设备后退按钮则按时间顺序返回(字面意思是下一个)背堆上的活动。)
根据您开始活动的方式以及您为该活动指定的启动模式,当您点击“向上”按钮时,您可能会被定向到该父活动的新实例而不是现有实例。
请阅读以下内容以了解更多详情:http://developer.android.com/training/implementing-navigation/ancestral.html#NavigateUp
我的猜测是发生了什么(从我链接的页面):
如果父活动具有启动模式< standard>,并且up intent不包含FLAG_ACTIVITY_CLEAR_TOP,则从堆栈弹出父活动,并在堆栈顶部创建该活动的新实例以接收意图。
尝试将您的活动2的启动模式(或您似乎正在失去额外费用的任何活动)设置为singleTop
。