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");
}
});
我只是想从我的 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");
}
});