Android NullPointerException - Spinner onItemSelected `view` 参数在旋转后为空 [英] Android NullPointerException - Spinner onItemSelected `view` parameter is null after rotating

查看:16
本文介绍了Android NullPointerException - Spinner onItemSelected `view` 参数在旋转后为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

注意:另一个类似的 SO 问题的答案的限制性解决方法对我有用,但我很感兴趣寻找真正的解决方案.解决方法是将其添加到我的活动中:

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.

我的应用在最新的 Android(棉花糖、棒棒糖)上旋转时崩溃,但它在 KitKat 上运行.在 Spinner onClick 方法中,我得到了父级的第一个子级,它是下拉列表中的第一个文本视图(又名微调器).当我不旋转它时它工作得很好.此外,当我注释掉抛出 NullPointerException 的那一行时,它也能正常工作.所以这是问题的唯一原因.

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.

我知道它是 Null,但我不明白为什么,或者如何解决它?另外,请注意我不能为此使用 XML,因为文本颜色仅在运行时动态知道.另外,我希望最小 API 为 15.

我添加了一些调试代码,发现在旋转之前,parentview 参数都不为空.但旋转后,view 为空.(但 parent 仍然不为 null).

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:

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 方法:

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


    }

日志:

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

推荐答案

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

adapterView 被引用到 Spinner,而不是您点击的项目,您应该转换为view"参数.

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

@Rock Lee旋转后布局将被刷新,您应该在一些回调函数中重置微调器,例如 onConfigurationChanged(Configuration newConfig),屏幕旋转后Android列表视图消失

@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

这篇关于Android NullPointerException - Spinner onItemSelected `view` 参数在旋转后为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆