单击应用程序小部件的空指针

问题描述 投票:-2回答:1

我正在开发一个名为Baking App的Udacity项目。该应用程序显示了一些蛋糕食谱。这个应用程序应该有一个主屏幕小部件,它应显示所需食谱的成分列表。现在我的应用程序有一个小部件,显示最后看到的成分列表,但当我点击它时,应用程序崩溃由于Npe。这是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

以下是导致崩溃的行:

 recipeArrayList = indexRecipe.getParcelableArrayList(INDEX_RECIPE);

我还提供了活动代码:

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);
    }
}

任何人都可以帮我解决这个问题吗?

android android-widget
1个回答
-1
投票
if (savedInstanceState == null){
    Bundle indexRecipe = getIntent().getExtras();

你应该检查savedInstanceState!= null

© www.soinside.com 2019 - 2024. All rights reserved.