java - Android : getting error in FragmentTransaction , 开始事务方法

标签 java android android-fragments fragment-transitions

我已经了解了 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 a FragmentTransaction until it is committed and attached to its activity.

并且为刚刚创建的 Fragment 返回 null。

关于java - Android : getting error in FragmentTransaction , 开始事务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61510788/

相关文章:

java - 从另一个 fragment 返回后如何防止 fragment 刷新recyclerview/保存recyclerview位置

android - 将 Android fragment 保存在 Backstack 中

java - PropertyPlaceholderConfigurers 在参数化 DataSource bean 之后加载

java - Android - 通用图像加载器中具有另一个 View 的 ImageView

java - 在按钮上显示 float

android - 仅在重新启动APP时alertDialogBu​​ilder才会崩溃

android - 退出对话框 fragment 后如何更新 MainActivity 中的 TextView?

java - 单例中的单例

java - 在 Java 中将字节数组转换为 Blob 的最简单方法

java - 使用带有 fragment 的工具栏