I have a “Bottom navigation bar app” with 3 tabs or fragments. On the first fragment I have a PaintView that I can draw on. Drawing works great. But I’m trying to wire up a clear screen function that is invoked via an options menu dropdown. When I select the option to wipe the screen from the options menu, the app crashes with the following error:
java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.mobile_testapp_android_2.ui.home.PaintView.clearView()' on a null object reference
Here is the code in the HomeFragment.java file for the options menu:
public class HomeFragment extends Fragment {
private PaintView paintView;
@Override
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
PaintView homeFragmentView = new PaintView(requireContext());
return homeFragmentView;
}
//Enable Clear Menu in this fragment
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
super.onCreate(savedInstanceState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
//inflate menu
inflater.inflate(R.menu.menu_swipes, menu);
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
//Handle menu item clicks here
int id = item.getItemId();
if (id == R.id.action_clearScreen) {
//do clear function here:
paintView.clearView();
Toast.makeText(getActivity(), "Clear Screen", Toast.LENGTH_SHORT).show();
}
return super.onOptionsItemSelected(item);
}
}
And here is the code in the PaintView file which contains the clearView() method that I am trying to invoke:
public class PaintView extends View {
public ViewGroup.LayoutParams params;
private Path myPath = new Path();
private Paint brush = new Paint();
private boolean forceClear;
public PaintView(Context context) {
super(context);
brush.setAntiAlias(true);
brush.setColor(Color.MAGENTA);
brush.setStyle(Paint.Style.STROKE);
brush.setStrokeJoin(Paint.Join.ROUND);
brush.setStrokeWidth(8f);
params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
}
//Clear function
public void clearView() {
try {
forceClear = true;
invalidate();
} catch (Exception ee) {
Log.d("Clear Button: ", "We blew up!! " + ee);
}
}
I’m thinking that the problem is due to the way that I instantiate the PaintView class in the HomeFragment.java file, but I don’t get any compilation errors and I can use dot notation paintView.clearView()
to access the methods within the PaintView class just fine.
Any tips on what I am doing wrong would be greatly appreciated!
Here are a few screenshots:
Advertisement
Answer
Try to use the variables, which you define:
// PaintView homeFragmentView = new PaintView(requireContext());
this.paintView = new PaintView(requireContext());