Java 如何使用接口在片段和活动之间进行通信?

Java 如何使用接口在片段和活动之间进行通信?,java,android,interface,nullpointerexception,fragment,Java,Android,Interface,Nullpointerexception,Fragment,我只想从MainActivity调用一个片段方法 所以我试着使用一个接口 public interface MyInterface { void testMethod(); } 在我的片段(TestFragment.java)中,我实现了接口并重写了testMethod @Override public void testMethod() { Toast.makeText(getActivity(), "Test", Toast.LENGTH_LON

我只想从MainActivity调用一个片段方法

所以我试着使用一个接口

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:

尝试调用虚拟方法“java.lang.String” 空对象引用上的android.content.Context.getPackageName() 这与祝酒词有关

如何从MainActivity中的接口调用该方法而不获取NullPointerException


如果您想从“活动”到“片段”访问您的方法,请多谢。您不需要任何接口。您只需要从片段实例调用该方法。但是,如果需要访问活动的方法,可以使用该接口

public interface MyInterface {
        void testMethod();
}
在你的活动中

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();
        }
}
在main()中,您可以创建一个MyActivity的新对象,如下所示,该对象将允许您访问该方法:

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

您需要为它创建如下所示的界面

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) {

    }
}
 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");

        }
        });
片段类应该如下所示

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) {

    }
}
 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");

        }
        });
Activity
类中,您需要创建方法
setOnDataListener
并初始化片段,如下所示

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) {

    }
}
 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");

        }
        });
同样,在活动内部,您可以从任何单击或事件发送数据,您只需要从活动调用此方法,以如下所示的片段形式传输数据

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) {

    }
}
 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");

        }
        });

创建一个新片段,但不将其附加到任何活动。要显示Toast,您需要一个上下文(在本例中是片段所附加到的活动)。因为活动为
null
,所以应用程序崩溃。您需要使用FragmentManager的add/replace方法将片段附加到活动,然后直接调用fragment方法。在这种情况下不需要使用接口。@SonTruong我必须使用接口,因为我有一个TabFragment来管理所有子片段。因此,在我的主要活动中,我使用FragmentManager将ViewLayout替换为TabFragment。TabFragment包含2个片段,我想在其中一个片段中调用一个方法,而不是从TabFragment中调用。所以在这种情况下不可能使用FragmentManager,不是吗?片段由活动管理,子片段由父片段管理。如果您想从活动中调用子片段的方法,那么从您在片段上调用方法的活动中,基于操作/数据,片段将决定调用子片段的相应方法。当您想要从子片段调用父片段的方法,或者从片段调用活动的方法时,接口将非常有用。因为它将增加活动/片段之间的解耦,并使片段更加可重用。