fragment与activity之间如何使用接口进行通信?

How to use interface to communicate between fragment and activity?

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

所以我尝试使用接口。

public interface MyInterface {
        void testMethod();
}

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

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

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

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

但在这里我得到一个 nullPointerException:

Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference Which reffers to the Toast message.

如何在不出现 NullPointerException 的情况下从我的 MainActivity 中的接口调用方法?

谢谢

如果您想从 Activity 访问您的方法到 Fragment。您不需要任何界面。您只需要从片段实例中调用该方法。但是,如果你想访问Activity的方法,你可以使用接口。

public interface MyInterface {
        void testMethod();
}

在你的 activity,

class MyActivity implements MyInterface{
void testMethod(){
}
}

在你的片段中,

class MyFragment extends Fragment{
MyInterface myInterface;
public void onActivityCreated(final Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (getActivity() instanceof MyActivity) {
            myInterface = (MyInterface) getActivity();
        }
}
public interface MyInterface {
    void testMethod();
}

class MyActivity implements MyInterface{
    public void testMethod(){
    }
}

在您的 main() 中,您可以像这样创建一个新的 MyActivity 对象,这将允许您访问以下方法:

MyActivity example= new MyActivity(); 
example.testMethod(); 

您需要像下面那样为其创建接口

public interface FilterValuePassInterface {

    public void onSelectedFilterValue(String name);
}

片段 class 应如下所示

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 class 中,您需要创建方法 setOnDataListener 并像下面这样初始化片段

 MyFragment myFragment;
    public void setOnDataListener(MyFragment myFragment) {

    this.myFragment = myFragment;

    }

同样在 activity 中,您可以从任何点击或事件发送数据,您只需要从 activity 调用此方法来传输片段中的数据,如下所示

    YOUR_CLICK.setOnClickListener(new OnClickListener() {

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

        }
        });