无法在父 Activity 中调用 Fragment 方法

Posted

技术标签:

【中文标题】无法在父 Activity 中调用 Fragment 方法【英文标题】:Can't call Fragment method in parent Activity 【发布时间】:2021-03-13 16:48:50 【问题描述】:

我只是想从我的 MainActivity(parent) 中的一个片段中调用一个方法。 但是一旦我尝试调用该方法,我就会得到 NullPointerException。

尝试调用虚方法'void com.example.fragmenttest.TestFragment.testMethod()' 在空对象上 参考

这是我在 MainActivity 的 onCreate 中所做的:

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

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    fragmentTransaction.replace(R.id.containerView, new TestFragment()).commit();



    TestFragment fragment = (TestFragment) fragmentManager.findFragmentById(R.id.testfragment);
    fragment.testMethod();

这是片段:

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) 
    View rootView=inflater.inflate(R.layout.activity_fragment,container,false);

    return  rootView;


public void testMethod()
    Toast.makeText(getContext(), "Test", Toast.LENGTH_LONG).show();

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context=".MainActivity">

    <FrameLayout
        android:orientation="vertical"
        android:layout_
        android:layout_
        android:id="@+id/containerView">



    </FrameLayout>


</RelativeLayout>

和activity_fragment.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_
    tools:context="com.example.fragmenttest.MainActivity"
    android:id="@+id/testfragment">


    <TextView
        android:layout_
        android:layout_
        android:layout_centerInParent="true"
        android:textSize="50dp"
        android:text="Fragment" />
</RelativeLayout>

当然,这不是我真正的项目,我只是创建了一个新项目来简化我的问题。 在我的实际项目中,我想在调用 onRewardedVideoCompleted 方法后立即从我的片段中调用一个方法,该方法位于我的 MainActivity 中。

如何从我的片段中调用方法而不会出现空指针异常并且不使用接口? (对这个小问题使用接口似乎没有必要)

谢谢

【问题讨论】:

【参考方案1】:

commit() 是异步的。这就是您的项目在启动时崩溃的原因。不要使用commit(),而是使用commitNow()。另外,不要使用new TestFragment(),而是创建一个变量,以便您可以调用它的方法。

TestFragment testFragment= new TestFragment();

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.containerView, testFragment).commitNow();

testFragment.testMethod();

【讨论】:

【参考方案2】:

片段事务是异步的(除非您使用 executePendingTransactions())。您的交易可能尚未完成。您在 FragmentTransaction(在支持库中)上使用 runOnCommit 在完成后执行代码。

【讨论】:

【参考方案3】:
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

TestFragment yourFragment = newe TestFragment();
fragmentTransaction.replace(R.id.containerView, yourFragment).commit();

yourFragment.testMethod();

首先,你必须将yourFragment传递给fragmentTransaction,然后你可以调用任何你想要的方法。

【讨论】:

这是不正确的。 Toast 消息将无法获取上下文,因此会崩溃。 您可以通过getContext()方法将上下文获取到片段中。 commit() 是异步的。如果片段管理器没有完成,getContext() 将不会返回上下文。 所以为fragment编写contractor方法,并将Activitycontext传递给fragment并使用它。 通过contractor 兄弟,将contractor 方法写入片段中,例如``` private Context context;公共 OrderFragment(上下文上下文) this.context = context; ```

以上是关于无法在父 Activity 中调用 Fragment 方法的主要内容,如果未能解决你的问题,请参考以下文章

Fragmen直接来回切换deno

在父Activity onBackPressed方法中调用Fragment接口方法

gitee查询用户名和密码 Android Studio 3.5以上版本新特性 sharePreferences 使用 不同的Activity间的preferences共享问题 Fragmen

当我在父 Activity 中按下 onBackpressed 时,如何控制 Fragment 中的 VideoView?

在父 Activity 中实现内部 Fragment 类

Fragment 使用详解