无法在父活动中调用片段方法

ki0zmccv  于 2021-07-07  发布在  Java
关注(0)|答案(3)|浏览(296)

我只想从mainactivity(父级)中的片段调用一个方法。但是当我尝试调用这个方法时,我得到了一个nullpointerexception。
尝试对空对象引用调用虚拟方法“void com.example.fragmenttest.testfragment.testmethod()”
以下是我在创建main活动时所做的:

@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();
}

活动\u 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_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <FrameLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/containerView">

    </FrameLayout>

</RelativeLayout>

和activity\ u 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_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.fragmenttest.MainActivity"
    android:id="@+id/testfragment">

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

当然这不是我真正的项目,我只是创建了一个新项目来简化我的问题。在我的实际项目中,我想在调用onRewarddVideoCompleted方法后立即从片段中调用一个方法,该方法在我的mainactivity中。
如何从片段中调用方法而不获取空指针异常和不使用接口(为这个小问题使用接口似乎是不必要的)
谢谢

yhived7q

yhived7q1#

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();
4nkexdtk

4nkexdtk2#

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

dced5bon

dced5bon3#

FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

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

yourFragment.testMethod();

首先,你必须通过 yourFragmentfragmentTransaction ,则可以调用所需的任何方法。

相关问题