OnBackPress在Android中的行为有所不同

时间:2018-07-05 05:59:34

标签: java android nullpointerexception back

我有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"); 

因为显然没有东西可取...我该如何解决

4 个答案:

答案 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时会发生什么。

基于documentation

  
      
  • 如果父级活动具有启动模式<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 上,您应该检查是否已IntentExtra

Intent i = getIntent();
if (i.hasExtra("Recievers_Id")) {
    messageRecieverId = i.getStringExtra("Recievers_Id");
} 
if (i.hasExtra("Recievers_Name")) {
    messageRecieverName= i.getStringExtra("Recievers_Name");
}