Android应用在单击“无线电”按钮上崩溃,抛出NullPoInterException



好吧,所以我是Android开发的新手,几天开始我一直在自学。我在YouTube上关注了一些教程,但我被困在其中一个教程上,即:

碎片活动交流:https://www.youtube.com/watch?v=2c0iog5rfxo&t = 820S

该教程是关于从片段上的无线电按钮选择中更改主活动的背景颜色。我确实做了他在教程中所做的事情,但是我必须以不同的方式使用onattach方法,因为他使用了视频(活动活动)中的视频中的弃用方式。因此,我使用了Onattach(上下文上下文)(请参阅下面的代码)

但是,当我选择"广播"按钮,应用程序崩溃和错误日志时,我会遇到错误:

致命例外:主要 过程:FragmentApplication2,PID:4318 java.lang。>在null对象引用上 在com.example.name.name.fragmentapplication2.ColorFragment $ 1.OncheckedChanged(ColorFragment.Java:36)

从此我知道我在片段类中制作的接口的实例是无效的,这导致了此例外。因为我正在使用它的实例来调用其函数在放射线群的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)

那么如何解决此问题?我如何启动接口的实例,以使其不包含null?

删除额外的条件。

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

只需将Context施放给听众即可。您不需要先进行活动。

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


如果您真的想要一项活动,则应有onAttach(Activity activity)如果您使用了支持片段class

最新更新