0

I have learning about Fragment , when i try to change Fragment via clicks Button , and App is Force Stopped , its gives error like this

Error message in Logcat :

  E/AndroidRuntime: FATAL EXCEPTION: main
    Process: mb.ganesh.fragment_practices, PID: 10451
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
        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)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
        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) 
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.fragment.app.FragmentTransaction androidx.fragment.app.FragmentManager.beginTransaction()' on a null object reference
        at mb.ganesh.fragment_practices.MainActivity.changeFragemnet(MainActivity.java:29)
        at java.lang.reflect.Method.invoke(Native Method) 
        at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397) 
        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) 

Actually i want to change Fragment via click Buttons , any Devs please fix this problem .

MainActivity:

package mb.ganesh.fragment_practices;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentTransaction;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    public void changeFragemnet(View view){
        Fragment fragment;
        if (view == findViewById(R.id.b1)){
            fragment = new FragmentOne();
            FragmentManager fm = fragment.getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
             ft.replace(R.id.firstFM , fragment);
            ft.commit();
        }
    }
}

The above code has one warning at FragmentTransaction ft = fm.beginTransaction();

activity_xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <Button
        android:id="@+id/b1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="changeFragemnet"
        android:padding="20dp"
        android:text="@string/fragment_1" />
    <fragment
        android:id="@+id/firstFM"
        android:name="mb.ganesh.fragment_practices.FragmentOne"
        android:layout_width="match_parent"
        android:layout_height="0px"
        android:layout_weight="1" />
    <Button
        android:id="@+id/b2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="20dp"
        android:onClick="changeFragemnet"
        android:text="@string/fragment_2" />
</LinearLayout>
Ganesh MB
  • 1,109
  • 2
  • 14
  • 27
  • have you really gone through fragment android doc? Frame layout container etc etc – hemen Apr 29 '20 at 20:19
  • nope! i am not following android doc, this is one youtuber suggest this method to display fragments , if you have any idea to change fragments please tell me. – Ganesh MB Apr 29 '20 at 20:24

1 Answers1

0

In MainActivity the line:

FragmentManager fm = fragment.getFragmentManager();

Should be:

FragmentManager fm = getSupportFragmentManager();

Return the FragmentManager for interacting with fragments associated with this activity.

As you can read in the docs

Return the FragmentManager for interacting with fragments associated with this fragment's activity. Note that this will be non-null slightly before getActivity(), during the time from when the fragment is placed in a FragmentTransaction until it is committed and attached to its activity.

And is returning null for the just created Fragment.

jeprubio
  • 17,312
  • 5
  • 45
  • 56
  • it has only `getSupportFragmentManager` – Ganesh MB May 01 '20 at 00:17
  • well, yes, because it extends AppCompatActivity. Use `getSupportFragmentManager()` but the one of the activity and you'll get rid of that NullPointerException that there is in your stack trace. – jeprubio May 01 '20 at 14:25