我有一个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>
答案 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();