我有3个活动: A , B , C 。当我在活动 A 中的RecyclerView
中单击一个项目时,活动 B 将被打开。我已经从 A 传递给 B 的几个String
值。
在活动 B 中,当我单击按钮时,将转到活动 C 。在 C 中,当我按手机上的“后退”按钮(Android默认的后退按钮)时,它通常会返回到活动 B 。但是我也使用父级活动在ToolBar
中放置了后退按钮。当我按下该按钮时,它向我显示错误:尝试在活动B中检索的String
值为空。我了解为什么会显示错误。显然是因为没有任何字符串从C传递到B进行提取。
但是,当我从手机默认按钮上按回时,为什么我没有收到此错误?我该怎么解决?
活动A
Intent intent = new Intent(getActivity(), Chat.class);
intent.putExtra("Recievers_Id", userId);
intent.putExtra("Recievers_Name", userName);
startActivity(intent);
活动B
MessageSenderId = mAuth.getCurrentUser().getUid();
MessageRecieverId = getIntent().getStringExtra("Recievers_Id");
MessageRecieverName = getIntent().getStringExtra("Recievers_Name");
活动C
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
在上出现错误
MessageRecieverId = getIntent().getStringExtra("Recievers_Id");
MessageRecieverName = getIntent().getStringExtra("Recievers_Name");
因为显然没有东西可取...我该如何解决
答案 0 :(得分:0)
将onClickListener
添加到工具栏的后退按钮:
toolbar.setNavigationOnCLickListener(new View.OnClickListener){
@Override
public void onClick(View view) {
finish();
}
});
如果null错误,请尝试以下操作:
if(getIntent().getStringExtra("Recievers_Id") != null){
MessageRecieverId = getIntent().getStringExtra("Recievers_Id");
}
if(getIntent().getStringExtra("Recievers_Name") != null){
MessageRecieverName = getIntent().getStringExtra("Recievers_Name");
}
答案 1 :(得分:0)
您可以将工具栏上的后退按钮的工作设置为:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
//NavUtils.navigateUpFromSameTask(this);
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
答案 2 :(得分:0)
首先,您需要了解当用户按下向上导航按钮时会发生什么以及onBackPressed
时会发生什么。
- 如果父级活动具有启动模式
<singleTop>
,或者向上意图包含FLAG_ACTIVITY_CLEAR_TOP
,则父级活动被带入 到堆栈的顶部,并通过其接收意图 onNewIntent()方法。- 如果父级活动具有启动模式,并且向上意图不包含
FLAG_ACTIVITY_CLEAR_TOP
,则父级活动 从堆栈中弹出,,该活动的新实例是 在堆栈顶部创建以接收意图。
与按下后退按钮时一样,它以相反的时间顺序浏览屏幕的历史记录。在这种情况下,将不会重新创建活动。
总而言之,您在AndroidManifest.xml中的ActivityB
的劳厄模式必须为standard
。在这种情况下,当您按下向上导航按钮时,将重新创建活动。但是,当按下后退按钮时,ActivityB
只是出现在前面,因此行为有所不同。
解决方案:
方法1:自己处理向上按钮
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId()== android.R.id.home {
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}
方法2:
在AndroidManifest.xml中将活动B的启动模式设置为singleTop
。请记住检查一下更改launch mode的含义。
“标准”和“单顶”模式的不同之处仅在于 一个方面:每次都有新的“标准”意图 活动中,将创建该类的新实例来对此进行响应 意图。每个实例都处理一个意图。同样,新 还可以创建“ singleTop”活动的实例来处理新 意图。 但是,如果目标任务已经有一个现有实例 活动在其堆栈的顶部,该实例将收到 新的意图(在onNewIntent()调用中);新实例不是 已创建。
答案 3 :(得分:0)
在活动 B 上,您应该检查是否已Intent
为Extra
。
Intent i = getIntent();
if (i.hasExtra("Recievers_Id")) {
messageRecieverId = i.getStringExtra("Recievers_Id");
}
if (i.hasExtra("Recievers_Name")) {
messageRecieverName= i.getStringExtra("Recievers_Name");
}