后退按钮抛出NullPointerException

时间:2017-11-11 09:47:06

标签: java android

我有一个MainActivity的流程 - > StoriesActivity - > StoryBodyActivity。

每个使用Intents将变量传递给下一个。

我试图将StoryBodyActivity的后退按钮实现为StoriesActivity,但是它在StoriesActivity中的authorID = extras.getInt("author_id");上抛出了NullPointerException。

我知道NullPointer是什么。我只是不知道如何解决这个问题!可能是因为它不再能够访问从MainActivity传递的数据吗?

注意:单击设备上的后退按钮时,此功能正常,而不是ActionBar上的图标。

来自StoryBodyActivity的

片段:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_story_body);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            // Respond to the action bar's Up/Home button
            case android.R.id.home:
                NavUtils.navigateUpFromSameTask(this);
                return true;
        }
        return super.onOptionsItemSelected(item);
    }
来自StoriesActivity的

片段:

private int authorID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stories);

        Bundle extras = getIntent().getExtras();

        authorID = extras.getInt("author_id"); // NullPointerException here
        final String authorName = extras.getString("author_name");
        Log.i("click", Integer.toString(authorID));
}
来自MainActivity的

片段:

Intent intent = new Intent(MainActivity.this, StoriesActivity.class);
intent.putExtra("author_id", author.getID());
intent.putExtra("author_name", author.getName());
startActivity(intent);
来自AndroidManifest的

Snippet:

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

        <activity
            android:name=".MainActivity" android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity
            android:name=".StoriesActivity"
            android:theme="@style/AppTheme.NoActionBar" />

        <activity
            android:name=".StoryBodyActivity"
            android:theme="@style/AppTheme"
            android:parentActivityName="com.example.apple.bookshelf.StoriesActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.apple.bookshelf.StoriesActivity" />
        </activity>

    </application>

5 个答案:

答案 0 :(得分:2)

您面临的问题是因为以下行:&#39; android:parentActivityName =&#34; com.example.apple.bookshelf.StoriesActivity&#34;&#39;

当您按下自定义后退按钮时,它正在创建StoriesActivity的新实例。我建议删除:

android:parentActivityName="com.example.apple.bookshelf.StoriesActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.apple.bookshelf.StoriesActivity" />

并替换

NavUtils.navigateUpFromSameTask(this);

onBackPressed();

答案 1 :(得分:1)

这里有两个解决方案:

首先检查extras是否存在:

if(extras != null){    
    authorID = extras.getInt("author_id"); // NullPointerException here
    final String authorName = extras.getString("author_name");
    Log.i("click", Integer.toString(authorID));
}

第二个解决方案是在StoryBodyActivity中使用finish()而不是NavUtils.navigateUpFromSameTask(this);

希望有所帮助:)

答案 2 :(得分:0)

为防止这种情况发生,您可以检查参加此活动时是否存在额外费用。

 if (getIntent().hasExtra("author_id")){
        authorID = getIntent().getIntExtra("author_id",0);
    }

答案 3 :(得分:0)

试试这种方式

 SharedPreferences sharedPref1 = getSharedPreferences("alldetais", Context.MODE_PRIVATE);
                    SharedPreferences.Editor editor1 = sharedPref1.edit();
                      editor1.putString("author_id", author.getID());
                editor1.putString("author_name", author.getName())
    editor1.commit();

并以此方式

 SharedPreferences sharedPref1 = getApplicationContext().getSharedPreferences("alldetais", Context.MODE_PRIVATE);
        author_id=sharedPref1.getString("author_id","");

答案 4 :(得分:0)

我没有看到你的代码,但是我可以提供建议,你必须顺应活动的流程,将其可视化如下, 活动A - &gt;活动B - &gt;活动C. 所以现在,如果你想使用从A到C的意图传递数据,那么你必须将数据从A发送到B,然后在B中接收它,然后再将接收到的数据从B传递给C然后使用它。此外,我认为从A中获取B数据的更正确的方法是 Intent intent = getIntent(); intent.getExtras();

相关问题