为什么物理后退按钮与应用程序后退按钮不一样

时间:2018-08-03 18:10:07

标签: java android android-intent

我正在使用以下代码在工具栏中实现后退按钮。

toolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String seriesLeagueId = String.valueOf( getIntent().getStringExtra( "seriesLeagueId" ) );
                String seriesBowlerId = String.valueOf( getIntent().getIntExtra( "seriesBowlerId", 2 ) );
                String seriesSeriesId = String.valueOf( getIntent().getIntExtra( "seriesSeriesId", 2 ) );

                Intent intent=new Intent();
                intent.putExtra("seriesLeagueId",seriesLeagueId);
                intent.putExtra("seriesBowlerId",seriesBowlerId);
                intent.putExtra("seriesSeriesId", seriesSeriesId);
                setResult(1,intent);
                Log.d("PASSING SERIES_ID BACK","Series Id = >>>>" + seriesSeriesId + "<<<<");
                Log.d("PASSING BOWLER_ID BACK","Bowler Id = >>>>" + seriesBowlerId + "<<<<");
                Log.d("PASSING LEAGUE_ID BACK","League Id = >>>>" + seriesLeagueId + "<<<<");
                finish();//finishing activity
            }
        });

当我使用物理后退按钮时,应用程序崩溃了,Logcat告诉我以下内容:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference
        at ca.rvogl.tpbcui.views.SeriesActivity.onActivityResult(SeriesActivity.java:393)

Java第393行如下:

String savedLeagueId=data.getStringExtra("seriesLeagueId");

但是据我所知,这行没有错。这也是它所属的代码。

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
        super.onActivityResult(requestCode, resultCode, data);
        //Check If Request Code Is The Same As What Is Passed - Here It Is 1
        if(requestCode==1)
        {
            String savedLeagueId=data.getStringExtra("seriesLeagueId");
            String savedBowlerId=data.getStringExtra("seriesBowlerId");
            seriesList.addAll( db.getAllSeries( savedLeagueId, savedBowlerId ) );
        }
    }

现在,如果我删除第一个代码段中的 finish(),则物理后退按钮可以正常工作,但工具栏的后退按钮不能正常工作,显然是因为它没有完成。当我进行调试时,我可以看到seriesLeagueId = NULL。但是,仅当按下物理后退按钮时。

任何人都可以提供有关此问题的一些见识。

onBackPressed代码

@Override
    public void onBackPressed() {
        String seriesLeagueId = String.valueOf( getIntent().getStringExtra( "seriesLeagueId" ) );
        String seriesBowlerId = String.valueOf( getIntent().getIntExtra( "seriesBowlerId", 2 ) );
        Intent intent=new Intent();
        intent.putExtra("seriesLeagueId",seriesLeagueId);
        intent.putExtra("seriesBowlerId",seriesBowlerId);
        setResult(1,intent);
        finish();//finishing activity
        overridePendingTransition(0, 0);
    }

1 个答案:

答案 0 :(得分:2)

这是工具栏按钮动作为navigate up on the stack而返回按钮动作为return back in the stack的设计决定。

https://developer.android.com/training/implementing-navigation/ancestral

因此NavigateUp的默认实现是使用NEW_TASK标志启动父活动,而返回按钮则将当前活动完成()。

据我所知,每个人都覆盖工具栏上的按钮,使其完全像返回按钮一样。

在您的情况下,请覆盖onBackPressed以处理后退按钮以及导航按钮。