Search code examples
androidandroid-studioandroid-fragmentsandroid-fragmentactivity

'Attempt to invoke interface method on a null object reference' in communicating between Fragments


I am trying to build a sample app which has two fragments in same activity. One fragment has EditText, SeekBar & a Button. Second Fragment has a TextView. On entering text in the EditText of first fragment and setting seekbar to appropriate value and clicking the button will change the text in the second fragment with the text entered in first fragment and size described by seekbar. I wrote a good code but the app keeps crashing on clicking the button. Please help!

Fragment one:


import ....

public class Toolbarfragment extends Fragment implements OnSeekBarChangeListener {
    private static int seekvalue = 10;
    private static EditText edittext;


    public interface ToolbarListener {
        void onButtonClick(int pos, String tex);
    }

    ToolbarListener activityCallback;
    @Override
    public View onCreateView( LayoutInflater inflater,  ViewGroup container,  Bundle savedInstanceState) {


        View view = inflater.inflate(R.layout.toolbarfragment, container, false);

        edittext= (EditText)view.findViewById(R.id.editTextTextPersonName);
        final Button button = (Button) view.findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                buttonclicked(v);
            }
        });

        final SeekBar seekBar = (SeekBar) view.findViewById(R.id.seekBar);

        seekBar.setOnSeekBarChangeListener(this);
        return view;

    }



    public void buttonclicked(View view) {

        activityCallback.onButtonClick(seekvalue, edittext.getText().toString());

    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

        seekvalue = progress;

    }

    @Override
    public void onStartTrackingTouch(SeekBar arg0) {

    }

    @Override
    public void onStopTrackingTouch(SeekBar arg0) {

    }



}

Fragment two:

import ...

public class TextFragment extends Fragment {
    private static TextView textview;
    @Override
    public View onCreateView(LayoutInflater inflater,  ViewGroup container,  Bundle savedInstanceState) {

        View view= inflater.inflate(R.layout.textfragment,container,false);

        textview = view.findViewById(R.id.textView);

        return view;
    }

    public void changetextproperties(int size, String text) {


        textview.setText(text);
        textview.setTextSize(size);
    }
}

Main Activity:


import ...

public class MainActivity extends FragmentActivity implements Toolbarfragment.ToolbarListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


    }

    @Override
    public void onButtonClick(int size, String text) {

        TextFragment textfragment= (TextFragment)getSupportFragmentManager().findFragmentById(R.id.fragment2);
        textfragment.changetextproperties(size, text);

    }
}

Logcat :

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.badatext, PID: 13829
    java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.badatext.Toolbarfragment$ToolbarListener.onButtonClick(int, java.lang.String)' on a null object reference
        at com.example.badatext.Toolbarfragment.buttonclicked(Toolbarfragment.java:52)
        at com.example.badatext.Toolbarfragment$1.onClick(Toolbarfragment.java:37)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)





Solution

  • Figured it out!

    By overriding OnAttach() method in Toolbarfragment class

    @Override
        public void onAttach(Context context) {
            super.onAttach(context);
    
                activityCallback = (ToolbarListener) context;}