Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android NullPointerException - Spinner onItemSelected `view` parameter is null after rotating

Note: A limiting workaround from another, similar SO question's answer worked for me, but I am interested in finding a true solution. The workaround was to add this to my Activity:

@Override  
protected void onSaveInstanceState(Bundle outState) { /* do nothing */ }

But I would still like to leave this question open in hopes for finding a better solution.


My app crashes when it rotates on the latest Android (Marshmallow, Lollipop), but it works on KitKat. In the Spinner onClick method, I get the first child of the parent, which is the first textview in the dropdown list (aka spinner). It works just fine when I do not rotate it. Also, when I comment-out that line that throws the NullPointerException, it works just fine too. So that is the only cause of the problem.

I know it is Null, but I don't understand why, or how to fix it? Also, please note that I cannot use XML for this, because the text color is only known dynamically at runtime. Also, I want the minimum API to be 15.

I added some debug code, and found out that before rotating, parent and view parameters are both not null. But after rotating, view is null. (But parent is still not null).

See ****** by the line that has the null pointer exception:

private void setUpSpinner(int accentColor, final int backgroundColor, Toolbar toolbar)
{
    Spinner spinner = (Spinner) findViewById(R.id.spinner);

    //Get rid of the normal toolbar's title, because the spinner is replacing the title.
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    //Set the choices on the spinner by setting the adapter.
    spinner.setAdapter(new SpinnerAdapter(toolbar.getContext(), new String[]{"Overview", "Story", "Specifications", "Poll", "Video"},
            accentColor, backgroundColor));

    //Set the listener for when each option is clicked.
    spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener()
    {

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id)
        {
            Log.e("ITEM SELECTED", "SPINNER" + Integer.toString(position));

            //This is necessary to set the color of the "action bar title." (Really, this is just
            //changing the text color of the spinner when it is at rest; or changing the selected
            //option's color.)
 ****************((TextView) view).setTextColor(backgroundColor);

            //Change the contents of the DealPage depending on what option was selected in the spinner.
           // CODE OMITTED
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent)
        {
        }
    });
}

spinner_item.xml:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@android:id/text1"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:textAppearance="?android:attr/textAppearanceListItemSmall"
          android:gravity="center_vertical"
          android:padding="5dp"
          android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

OnCreate method:

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        context = this;
        RealmDatabase.setRealmInstance(this);

        //----------- UNPACK EXTRAS -----------
        String date = getIntent().getExtras().getString(KeyStrings.EXTRA_DATE);

        //---------------- PREREQUISITE INITIALIZATION ----------
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_deal_page);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar_with_spinner);
        setSupportActionBar(toolbar);

        //------------ Enable "UP" navigation ---------------
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        getDataFromDatabase(date);

        //----------------- THEMES AND COLORS ------------------

        //Set up colors
        final int backgroundColor = this.deal.getTheme().getBackgroundColor().getColor();
        final int accentColor = this.deal.getTheme().getAccentColor().getColor();
        String themeForeground = this.deal.getTheme().getForeground();
        final int foreground = generateForegroundColor(themeForeground);
        final String foregroundWebView = generateForegroundWebViewString(themeForeground); // This is necessary because HTML does not have an alpha channel.

        //Set toolbar colors
        toolbar.setBackgroundColor(accentColor);
        toolbar.setTitleTextColor(backgroundColor);

        //Set Page Background Color
        RelativeLayout dealPageBackground = (RelativeLayout) findViewById(R.id.deal_page_background);
        dealPageBackground.setBackgroundColor(backgroundColor);

        //----------- INITIALIZE THE ACTUAL DEAL PAGE STUFF ----------------

        //Title
        TextView title = (TextView) findViewById(R.id.title);
        title.setText(this.deal.getTitle());
        title.setTextColor(foreground);

        //Price
        TextView price = (TextView) findViewById(R.id.price);
        NumberFormat fmt = NumberFormat.getCurrencyInstance();
        price.setText(fmt.format(this.deal.getItems().first().getPrice()));
        price.setTextColor(foreground);

        //ViewInBrowser
        setUpViewInBrowserButton(backgroundColor, accentColor);

        AndDown andDown = new AndDown();

        //Set up "linkColorHTML"
        String linkColorHTML = generateLinkColorHTML(accentColor);

        //Features
        setUpFeaturesView(andDown, backgroundColor, linkColorHTML, foregroundWebView);

        //More Specs button
        setUpMoreSpecsButton(backgroundColor, foreground, (Spinner) findViewById(R.id.spinner));

        //Story Title
        TextView storyTitle = (TextView) findViewById(R.id.story_title);
        storyTitle.setText(this.deal.getStory().getTitle());
        storyTitle.setTextColor(accentColor);

        //Story Body
        setUpStoryBody(andDown, backgroundColor, linkColorHTML, foregroundWebView);

        //Specs Title
        TextView specsTitle = (TextView) findViewById(R.id.specs_title);
        specsTitle.setText(this.deal.getTitle());
        specsTitle.setTextColor(accentColor);

        //Specs
        setUpSpecificationsView(andDown, backgroundColor, linkColorHTML, foregroundWebView);

        //Set up ViewPager
        ViewPager viewPager = (ViewPager) findViewById(R.id.photos_view_pager);
        viewPager.setAdapter(new PhotoPagerAdapter(this, this.deal.getPhotos()));

        //Set up spinner
        setUpSpinner(accentColor, backgroundColor, toolbar);

        //Set up poll title
        TextView pollTitle = (TextView) findViewById(R.id.poll_title);
        pollTitle.setText(this.poll.getTitle());
        pollTitle.setTextColor(accentColor);

        //Set up poll view-forum-topic-in-browser button
        setUpViewForumTopicInBrowserButton(backgroundColor, accentColor);

        //Set up poll
        setUpPoll(foreground, accentColor);

        //Set up video title
        TextView videoTitle = (TextView) findViewById(R.id.video_title);
        videoTitle.setText(this.video.getTitle());
        videoTitle.setTextColor(accentColor);

        //Set up video view-forum-topic-in-browser button
        setUpViewVideoForumTopicInBrowserButton(backgroundColor, accentColor);

        //Set up youtube video
        setUpYoutubeVideo();


    }

Log:

11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: FATAL EXCEPTION: main
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: Process: com.example.meh, PID: 6507
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setTextColor(int)' on a null object reference
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at com.example.meh.Deal.DealPage$6.onItemSelected(DealPage.java:480)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.AdapterView.fireOnSelected(AdapterView.java:897)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.AdapterView.selectionChanged(AdapterView.java:884)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.AdapterView.checkSelectionChanged(AdapterView.java:1047)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.AdapterView.handleDataChanged(AdapterView.java:1027)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:184)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.Spinner.onMeasure(Spinner.java:507)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.support.v7.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:410)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.support.v7.widget.Toolbar.measureChildCollapseMargins(Toolbar.java:1225)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.support.v7.widget.Toolbar.onMeasure(Toolbar.java:1333)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.support.v7.internal.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:124)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.View.measure(View.java:17430)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1767)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.Choreographer.doCallbacks(Choreographer.java:580)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.Choreographer.doFrame(Choreographer.java:550)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
11-16 18:06:45.879 6507-6507/com.example.meh E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)f
like image 203
Rock Lee Avatar asked Nov 17 '15 01:11

Rock Lee


1 Answers

public void onItemSelected(AdapterView<?> parent, View view, int position, long id)

adapterView is referenced to Spinner, not the item you clicked, you should cast the "view" parameter instead.


@Rock Lee After rotated the layout would be refresh, you should resetup the spinner in some callback function like onConfigurationChanged(Configuration newConfig), Android listview disappears after screen rotation

like image 123
shiro Avatar answered Nov 16 '22 13:11

shiro