首页 > 解决方案 > 如何使用接口在片段和活动之间进行通信?

问题描述

我只是想从我的 MainActivity 中调用 Fragment 方法。

所以我尝试使用一个接口。

public interface MyInterface {
        void testMethod();
}

在我的片段(TestFragment.java)中,我实现了接口并覆盖了 testMethod 方法。

@Override
public void testMethod() {
    Toast.makeText(getActivity(), "Test", Toast.LENGTH_LONG).show();
}

但是现在我想在调用 onRewardedVideoCompleted get 后立即从我的 MainActivity 调用此方法,但我不知道该怎么做。我试过这样:

MyInterface myInterface = new TestFragment();
myInterface.testMethod();

但在这里我得到一个 nullPointerException:

尝试在引用 Toast 消息的空对象引用上调用虚拟方法“java.lang.String android.content.Context.getPackageName()”。

如何在 MainActivity 中从我的接口调用该方法而不会收到 NullPointerException?

谢谢

标签: javaandroidinterfacenullpointerexceptionfragment

解决方案


您需要为它创建接口,如下所示

public interface FilterValuePassInterface {

    public void onSelectedFilterValue(String name);
}

片段类应如下所示

class MyFragment extends Fragment implements FilterValuePassInterface {

   @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        try {
            ((YOUR_ACTIVITY) getActivity()).setOnDataListener(this);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }


    @Override
    public void onSelectedFilterValue(String name) {

    }
}

Activity类内部,您需要创建方法setOnDataListener并初始化片段,如下所示

 MyFragment myFragment;
    public void setOnDataListener(MyFragment myFragment) {

    this.myFragment = myFragment;

    }

再次在活动内部,您可以从任何点击或事件发送数据,您只需从活动中调用此方法即可在片段中传输数据,如下所示

    YOUR_CLICK.setOnClickListener(new OnClickListener() {

       public void onClick(View v) {
        // TODO Auto-generated method stub
        myFragment.onSelectedFilterValue("YOUR_MSG");

        }
        });

推荐阅读