【问题标题】:Android App crashes on Radio button click, throws NullPointerException [duplicate]Android 应用程序在单选按钮单击时崩溃,抛出 NullPointerException [重复]
【发布时间】:2017-03-04 15:33:27
【问题描述】:

好的,所以我是 Android 开发的新手,从几天开始我就一直在自学。我正在关注 youtube 上的一些教程,但我被困在其中之一上,即这个:

片段活动通讯:https://www.youtube.com/watch?v=2c0Iog5rfxo&t=820s

本教程是关于从片段上的单选按钮选择更改主要活动的背景颜色。 我完全按照他在教程中所做的,但我不得不以不同的方式使用 onAttach 方法,因为他在视频中使用了不推荐使用的方式,即 onAttach(Activity 活动)。所以我使用了 onAttach(Context context) (见下面的代码)

但是当我选择单选按钮时出现错误,应用程序崩溃并且错误日志显示:

致命异常:主要 进程:fragmentapplication2,PID:4318 java.lang.NullPointerException: 尝试调用接口方法 'void com.example.name.fragmentapplication2.ColorFragment$OnColorChangeListener.colorChanged(java.lang.String)' 在空对象引用上 在 com.example.name.fragmentapplication2.ColorFragment$1.onCheckedChanged(ColorFragment.java:36)

从这里我知道我在 Fragment 类中创建的接口实例为空,这导致了这个异常。 因为我在 RadioGroup 的 OnCheckedChangeListener 中使用它的实例来调用它的函数。下面是片段类:

package com.example.name.fragmentapplication2;

import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;

public class ColorFragment extends Fragment{
RadioGroup colorGroup;
OnColorChangeListener onColorChangeListener;//interface instance initiated

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view;
    view=inflater.inflate(R.layout.color_frag_layout,container,false);
    colorGroup=(RadioGroup)view.findViewById(R.id.color_radio_group);
    colorGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){
        @Override
        public  void onCheckedChanged(RadioGroup group, int CheckedId){
            switch (CheckedId)
            {
                case R.id.Red:
                    onColorChangeListener.colorChanged("#CF000F");
                    break;
                case R.id.black:
                    onColorChangeListener.colorChanged("#000000");
                    break;
                case R.id.gray:
                    onColorChangeListener.colorChanged("#6C7A89");
                    break;
            }
        }
    });
    return view;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    Activity activity;
    if(context instanceof Activity)
    {
        activity = (Activity)context;
        try{
            onColorChangeListener = (OnColorChangeListener)activity;
        }catch (ClassCastException e){
            throw new ClassCastException(activity.toString()
                    + " must implement OnColorChangeListener");

        }
    }
}


public interface OnColorChangeListener
{
    public void colorChanged(String ColorName);
}

}

Logcat:

E/AndroidRuntime: FATAL EXCEPTION: main
              Process: com.example.name.fragmentapplication2, PID: 4318
              java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.name.fragmentapplication2.ColorFragment$OnColorChangeListener.colorChanged(java.lang.String)' on a null object reference
                  at com.example.name.fragmentapplication2.ColorFragment$1.onCheckedChanged(ColorFragment.java:36)
                  at android.widget.RadioGroup.setCheckedId(RadioGroup.java:174)
                  at android.widget.RadioGroup.access$600(RadioGroup.java:54)
                  at android.widget.RadioGroup$CheckedStateTracker.onCheckedChanged(RadioGroup.java:358)
                  at android.widget.CompoundButton.setChecked(CompoundButton.java:157)
                  at android.widget.CompoundButton.toggle(CompoundButton.java:113)
                  at android.widget.RadioButton.toggle(RadioButton.java:78)
                  at android.widget.CompoundButton.performClick(CompoundButton.java:118)
                  at android.view.View$PerformClick.run(View.java:19866)
                  at android.os.Handler.handleCallback(Handler.java:739)
                  at android.os.Handler.dispatchMessage(Handler.java:95)
                  at android.os.Looper.loop(Looper.java:135)
                  at android.app.ActivityThread.main(ActivityThread.java:5254)
                  at java.lang.reflect.Method.invoke(Native Method)
                  at java.lang.reflect.Method.invoke(Method.java:372)
                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

那么我该如何解决这个问题呢?如何启动接口的实例,使其不包含空值?

【问题讨论】:

    标签: java android android-fragments nullpointerexception


    【解决方案1】:

    删除多余的条件。

    Activity activity;
    if(context instanceof Activity) 
    {
        activity = (Activity)context;
    

    只需将Context 投射到侦听器即可。您不需要先转换为 Activity 。

    context instanceof Activity 为假时,您将获得一个空侦听器。


    如果你真的想要一个 Activity,如果你使用 Support Fragments 类,应该有onAttach(Activity activity)

    【讨论】:

    • 我用过,但它说它已被弃用
    • 就像我说的,支持 Fragments 有那个方法,并且在那里没有被弃用。我知道你的教程没有使用这些,但是
    • 那么我应该使用支持片段吗?如果我只想使用这个片段怎么办?
    • 删除instanceof 的解决方案是否有效?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多