Java Android应用程序在单选按钮点击时崩溃,抛出NullPointerException
好的,我是Android开发新手,几天来我一直在自学。我正在youtube上观看一些教程,但我被其中一个卡住了,即: 片段活动通信: 本教程是关于从片段上的单选按钮选择更改主要活动的背景色。 我完全按照他在教程中所做的做了,但我不得不以不同的方式使用onAttach方法,因为他在视频中使用了不推荐的方式,即onAttach(Activity)。所以我使用了onAttach(上下文)(参见下面的代码) 但当我选择单选按钮时出现错误,应用程序崩溃,错误日志显示: 致命异常:主 流程: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)上 由此我知道我在片段类中创建的接口实例为null,这导致了这个异常。 因为我正在使用它的实例在RadioGroup的OnCheckedChangeListener中调用它的函数。下面是片段类:Java Android应用程序在单选按钮点击时崩溃,抛出NullPointerException,java,android,android-fragments,nullpointerexception,Java,Android,Android Fragments,Nullpointerexception,好的,我是Android开发新手,几天来我一直在自学。我正在youtube上观看一些教程,但我被其中一个卡住了,即: 片段活动通信: 本教程是关于从片段上的单选按钮选择更改主要活动的背景色。 我完全按照他在教程中所做的做了,但我不得不以不同的方式使用onAttach方法,因为他在视频中使用了不推荐的方式,即onAttach(Activity)。所以我使用了onAttach(上下文)(参见下面的代码) 但当我选择单选按钮时出现错误,应用程序崩溃,错误日志显示: 致命异常:主 流程:fragment
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);
}
}
日志:
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;
只需将上下文
投射给侦听器即可。你不需要先投一个活动
当Activity
的上下文实例为false时,您将得到一个空侦听器
如果您真的想要一个活动,那么应该有
onAttach(Activity-Activity)
如果您使用了Support Fragments类我使用过它,但它说它是不推荐的,就像我说的,Support Fragments有这个方法,并且它在那里没有被推荐。我知道你的教程没有使用这些,但我应该使用支持片段吗?如果我只想使用这个片段怎么办?删除实例的解决方案是否有效?