I’m working on a Udacity project called Baking App. The app shows some cakes recipes. This app should have a homescreen widget which should display ingredient list for desired recipe. Now my app has a widget which displays the last seen ingredient list, but when i tap on it the app crashes due to a Npe. Here is the logcat:
04-20 16:42:41.719 31369-31369/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.bakingapp, PID: 31369
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.bakingapp/com.example.android.bakingapp.RecipeDetailActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList android.os.Bundle.getParcelableArrayList(java.lang.String)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2434)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.ArrayList android.os.Bundle.getParcelableArrayList(java.lang.String)' on a null object reference
at com.example.android.bakingapp.RecipeDetailActivity.onCreate(RecipeDetailActivity.java:39)
at android.app.Activity.performCreate(Activity.java:6323)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2387)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2494)
at android.app.ActivityThread.access$900(ActivityThread.java:153)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1347)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5451)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)strong text
And here is the line that causes the crash:
recipeArrayList = indexRecipe.getParcelableArrayList(INDEX_RECIPE);
I also provide the Activity code:
package com.example.android.bakingapp;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.view.View;
import com.example.android.bakingapp.Adapters.DetailsAdapter;
import com.example.android.bakingapp.Models.Recipe;
import com.example.android.bakingapp.Models.Steps;
import java.util.ArrayList;
import java.util.List;
import static com.example.android.bakingapp.MainActivity.INDEX_RECIPE;
import static com.example.android.bakingapp.MainActivity.SELECTED_INDEX;
import static com.example.android.bakingapp.MainActivity.SELECTED_STEPS;
public class RecipeDetailActivity extends AppCompatActivity implements DetailsAdapter.ListClickListener,
StepsFragment.ListClickListener{
private ArrayList<Recipe> recipeArrayList;
String recipeName;
static String STACK_RECIPE_DETAIL="stack_recipe_detail";
static String STACK_RECIPE_STEP_DETAIL="STACK_RECIPE_STEP_DETAIL";
public static String SHARED_PREFERENCE_KEY = "SHARED_PREFERENCE_KEY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipe_detail);
if (savedInstanceState == null){
Bundle indexRecipe = getIntent().getExtras();
recipeArrayList = new ArrayList<>();
assert indexRecipe != null;
recipeArrayList = indexRecipe.getParcelableArrayList(INDEX_RECIPE);
assert recipeArrayList != null;
recipeName = recipeArrayList.get(0).getName();
final DetailFragment detailFragment = new DetailFragment();
detailFragment.setArguments(indexRecipe);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, detailFragment)
.addToBackStack(STACK_RECIPE_DETAIL)
.commit();
if(findViewById(R.id.recipe_linear_layout).getTag()!= null
&& findViewById(R.id.recipe_linear_layout).getTag().equals("tablet-land")){
final StepsFragment stepsFragment = new StepsFragment();
stepsFragment.setArguments(indexRecipe);
fragmentManager.beginTransaction()
.replace(R.id.fragment_container1,stepsFragment)
.addToBackStack(STACK_RECIPE_STEP_DETAIL)
.commit();
}
}else {
recipeName = savedInstanceState.getString("Title");
}
Toolbar bakingToolbar = (Toolbar) findViewById(R.id.baking_toolbar);
setSupportActionBar(bakingToolbar);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(recipeName);
bakingToolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
FragmentManager fragmentManager = getSupportFragmentManager();
if(findViewById(R.id.fragment_container1)== null){
if (fragmentManager.getBackStackEntryCount() > 1){
fragmentManager.popBackStack(STACK_RECIPE_DETAIL, 0);
}else if (fragmentManager.getBackStackEntryCount() > 0) {
//go back to "Recipe" screen
finish();
}
}
else {finish();
}
}
});
}
@Override
public void onItemClick(List<Steps> stepsList, int clickedIndex, String recipeName) {
final StepsFragment stepsFragment = new StepsFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
getSupportActionBar().setTitle(recipeName);
Bundle stepsBundle = new Bundle();
stepsBundle.putParcelableArrayList(SELECTED_STEPS, (ArrayList<Steps>) stepsList);
stepsBundle.putInt(SELECTED_INDEX, clickedIndex);
stepsBundle.putString("Title", recipeName);
stepsFragment.setArguments(stepsBundle);
if (findViewById(R.id.recipe_linear_layout).getTag() != null
&& findViewById(R.id.recipe_linear_layout).getTag().equals("tablet-land")) {
fragmentManager.beginTransaction()
.replace(R.id.fragment_container1, stepsFragment)
.addToBackStack(STACK_RECIPE_STEP_DETAIL)
.commit();
} else {
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, stepsFragment).addToBackStack(STACK_RECIPE_STEP_DETAIL)
.commit();
}
}
@Override
protected void onSaveInstanceState(@Nullable Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
assert savedInstanceState != null;
savedInstanceState.putString("Title",recipeName);
}
}
Can anyone help me to fix the issue?