Java 如何使用接口在片段和活动之间进行通信?
我只想从MainActivity调用一个片段方法 所以我试着使用一个接口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
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,不是吗?片段由活动管理,子片段由父片段管理。如果您想从活动中调用子片段的方法,那么从您在片段上调用方法的活动中,基于操作/数据,片段将决定调用子片段的相应方法。当您想要从子片段调用父片段的方法,或者从片段调用活动的方法时,接口将非常有用。因为它将增加活动/片段之间的解耦,并使片段更加可重用。