java.lang.NullPointerException: Attempt to invoke interface method 'OnColorChangeListener.colorChanged(java.lang.String)' on a null object reference
Solution 1
Chances are you need to override the overloaded version onAttach(Activity activity)
in the fragment as the other one that takes a Context
is not being called. This is most likely because your Android device is not API 23+ and the version of the method you are using was added in API 23.
@Override
public void onAttach(Activity activity) {
super.onAttach(context);
try {
onColorChangeListener = (OnColorChangeListener) context;
}
catch catch (Exception e){
// you should really do something here with this exception
}
}
EDIT
Alternatively switch to using the support library that includes the support fragment manager and fragments.
That should correctly call onAttach(Context context)
even on pre API 23 devices.
Solution 2
Try initializing the listener in onCreate()
or onActivityCreated()
method using getActivity()
onColorChangeListener = (OnColorChangeListener) getActivity();
user2590243
Updated on July 11, 2022Comments
-
user2590243 almost 2 years
I'm a beginner in Android so forgive me if this is a super easy fix. I've looked at other posts on here in regard to the same NullPointerException matter, however I still cannot find the source of the error in my code.
I have a very simple project that has Main java class and a fragment class. When a user clicks a radio button the background color of the main activity must change but I keep getting:
java.lang.NullPointerException: Attempt to invoke interface method 'OnColorChangeListener.colorChanged(java.lang.String)' on a null object reference.
Activity5.java:
public class Activity5 extends AppCompatActivity implements ColorFragment.OnColorChangeListener { LinearLayout linearLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_5); linearLayout = (LinearLayout)findViewById(R.id.main_layout_id); FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); ColorFragment colorFragment = new ColorFragment(); fragmentTransaction.add(R.id.fragment_container, colorFragment); fragmentTransaction.commit(); } @Override public void colorChanged(String colorname) { if(colorname.equals("RED")) { linearLayout.setBackgroundColor(Color.RED); } else if(colorname.equals("GREEN")) { linearLayout.setBackgroundColor(Color.GREEN); } else if(colorname.equals("BLUE")){ linearLayout.setBackgroundColor(Color.BLUE); } else if(colorname.equals("MAGENTA")) { linearLayout.setBackgroundColor(0xffff00ff); } else if(colorname.equals("YELLOW")) { linearLayout.setBackgroundColor(0xffffff00); } } }
Now here's the Fragment Class:
public class ColorFragment extends Fragment { OnColorChangeListener onColorChangeListener; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view; view = inflater.inflate(R.layout.color_fragment_layout, container, false); RadioGroup radioButtonGroup = (RadioGroup)view.findViewById(R.id.color_radio_group); radioButtonGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener(){ @Override public void onCheckedChanged(RadioGroup group, int checkIdOfButton) { switch (checkIdOfButton){ case R.id.red_id: onColorChangeListener.colorChanged("RED"); break; case R.id.green_id: onColorChangeListener.colorChanged("GREEN"); break; case R.id.blue_id: onColorChangeListener.colorChanged("BLUE"); break; case R.id.magenta_id: onColorChangeListener.colorChanged("MAGENTA"); break; case R.id.yellow_id: onColorChangeListener.colorChanged("YELLOW"); break; } } }); return view; } @Override public void onAttach(Context context) { super.onAttach(context); try { onColorChangeListener = (OnColorChangeListener) context; } catch catch (Exception e){} } } public interface OnColorChangeListener { public void colorChanged(String colorname); } }
Here is the XML Activity:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" app:layout_behavior="@string/appbar_scrolling_view_behavior" tools:context="com.example.user.seriousapp.Activity5" tools:showIn="@layout/activity_5" android:id="@+id/main_layout_id"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Fragment Communication Example" android:id="@+id/textView2" android:textColor="#000000"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="300dp" android:id="@+id/fragment_container" android:layout_marginTop="60dp" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:gravity="center"></RelativeLayout> </LinearLayout>
And finally here is the XML Fragment:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="250dp" android:background="#000000"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceLarge" android:text="Select a Color" android:textColor="#ffffff" android:id="@+id/textView3" android:layout_gravity="center_horizontal" /> <RadioGroup android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="25dp" android:layout_marginLeft="25dp" android:layout_marginRight="25dp" android:orientation="vertical" android:id="@+id/color_radio_group"> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="RED" android:textColor="#ffffff" android:buttonTint="#ffffff" android:id="@+id/red_id" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="GREEN" android:textColor="#ffffff" android:buttonTint="#ffffff" android:id="@+id/green_id" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="BLUE" android:textColor="#ffffff" android:buttonTint="#ffffff" android:id="@+id/blue_id" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="MAGENTA" android:textColor="#ffffff" android:buttonTint="#ffffff" android:id="@+id/magenta_id" /> <RadioButton android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="YELLOW" android:textColor="#ffffff" android:buttonTint="#ffffff" android:id="@+id/yellow_id" /> </RadioGroup> </LinearLayout>