我已经了解了 Fragment ,当我尝试通过单击 Button
更改 Fragment
时,并且应用程序被强制停止,它会给出这样的错误
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)
实际上我想通过点击按钮更改Fragment,请任何开发人员解决此问题。
主要 Activity :
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();
}
}
}
上述代码在 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>
最佳答案
在 MainActivity 中,该行:
FragmentManager fm = fragment.getFragmentManager();
应该是:
FragmentManager fm = getSupportFragmentManager();
Return the FragmentManager for interacting with fragments associated with this activity.
正如您可以在 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 aFragmentTransaction
until it is committed and attached to its activity.
并且为刚刚创建的 Fragment 返回 null。
关于java - Android : getting error in FragmentTransaction , 开始事务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510788/