java/Android接口无法从子片段到父片段工作
我试图在两个片段中交流,主体和儿童。但是,当我在子对象中声明接口以将值传递给主片段时,它可以正常工作,但是当我想从主对象传递给子片段时,它就不起作用了。顺便说一句,这个片段在我的主要活动中。 谢谢你的帮助 错误消息是:java/Android接口无法从子片段到父片段工作,java,android,android-fragments,interface,Java,Android,Android Fragments,Interface,我试图在两个片段中交流,主体和儿童。但是,当我在子对象中声明接口以将值传递给主片段时,它可以正常工作,但是当我想从主对象传递给子片段时,它就不起作用了。顺便说一句,这个片段在我的主要活动中。 谢谢你的帮助 错误消息是: Caused by: java.lang.IllegalArgumentException: com.example.example.example.MainActivity must implement interface NotifyOnTutorialPageSelecte
Caused by: java.lang.IllegalArgumentException: com.example.example.example.MainActivity must implement interface NotifyOnTutorialPageSelected
那么有没有一种不直接使用静态函数传递值的方法呢?因为我注意到只有父级可以实现接口,所以如果我想用接口实现它,我该怎么做呢?顺便说一下,这是为了学习
代码:
//MAin activity is something that calls only the mainfragment
public class MainActivity extends ActionBarActivity {
FragmentManager fragmentManager;
TutorialFragment tutorialFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
fragmentManager = getSupportFragmentManager();
fragmentManager.findFragmentById(R.id.card_message_frag);
tutorialFragment = (TutorialFragment) fragmentManager.findFragmentById(R.id.tutorial_frag);
}
}
头等舱(由MainActivity调用)
第二课堂(由TutorialFragment调用)
解决方案:
//MAin activity is something that calls only the mainfragment
public class MainActivity extends ActionBarActivity {
FragmentManager fragmentManager;
TutorialFragment tutorialFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
fragmentManager = getSupportFragmentManager();
fragmentManager.findFragmentById(R.id.card_message_frag);
tutorialFragment = (TutorialFragment) fragmentManager.findFragmentById(R.id.tutorial_frag);
}
}
既然没有人回答这个问题,如果有人有类似的困难,我就把答案留在这里。我通过实现MainActivity的接口解决了这个问题,因此MainActivity将调用childclass并调用方法:
//MAin activity is something that calls only the mainfragment
public class MainActivity extends ActionBarActivity implements NotifyOnTutorialPageSelected{
FragmentManager fragmentManager;
TutorialFragment tutorialFragment;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActionBar actionBar = getSupportActionBar();
actionBar.hide();
fragmentManager = getSupportFragmentManager();
fragmentManager.findFragmentById(R.id.card_message_frag);
tutorialFragment = (TutorialFragment) fragmentManager.findFragmentById(R.id.tutorial_frag);
}
@Override
public void notifyOnTutorialPageSelected(int index) {
FragmentManager fragmentChildManager = tutorialFragment.getChildFragmentManager();
MultiTabFragment multiTabFragment = (MultiTabFragment) fragmentChildManager.findFragmentById(R.id.multi_tabs_frag);
multiTabFragment.deselectPreviousTab(index);
}
}
它对我有用,或者至少对我想要的有用,如果有人有不同的解决方案,请告诉我,谢谢。您自己抛出异常,因为您的活动没有实现
NotifyOnTutorialPageSelected
接口,并且您的父片段不能实现OnTabSelected
接口
以下代码需要固定到前两个条件之一为真的位置。顺便说一句,您的else if语句中有一个潜在错误,因为您只检查它是否是OnTabSelected
的实例,但随后将父片段强制转换为NotifyOnTutorialPageSelected
:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (getActivity() instanceof NotifyOnTutorialPageSelected) {
notifyOnTutorialPageSelected = (NotifyOnTutorialPageSelected) getActivity();
} else if (getParentFragment() instanceof OnTabSelected) {
notifyOnTutorialPageSelected = (NotifyOnTutorialPageSelected) getParentFragment();
} else {
throw new IllegalArgumentException(activity + " must implement interface " + NotifyOnTutorialPageSelected.class.getSimpleName());
}
}
查看您的代码,我看不出您是如何拥有子片段的,因为您的教程片段没有创建子片段
您是否试图让一个活动显示两个可通信的片段
如果是这样的话,请看一看关于如何使用接口实现这一点的说明
编辑:
通过这次学习,您可能会发现代码中还有很多错误。但是,为了让您前进并远离当前错误,请删除TutorialFragment
片段中的onAttach
方法,因为它无论如何都是错误的。如果你想让你的活动
类实现回调接口,那么回调接口就是它要去的地方。既然您不是这样做的,那么检查您的活动是否实现了该特定接口就没有意义了
您的MultiTabFragment.onAttach
方法只需要以下内容,除非您有时要将片段直接放入活动中:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (getParentFragment() instanceof OnTabSelected) {
onTabSelected = (OnTabSelected) getParentFragment();
} else {
throw new IllegalArgumentException("Parent Fragment must implement interface " + OnTabSelected.class.getSimpleName());
}
}
最后,由于您已经在教程片段
中保留了对多片段
的引用,请删除NotifyOnTutorialPageSelected NotifyOnTutorialPageSelected
并直接调用片段
@Override
public void onPageSelected(int position) {
multiTabFragment.notifyOnTutorialPageSelected(position); // do something so can communicate with the child fragment
}
已经回答了你的问题!谢谢你,伙计!我现在就试试NotifyOnTutorialPagesSelected=(NotifyOnTutorialPagesSelected)getParentFragment();若您的notifyOnTutorialPageSelected是由子片段实现的,那个么您怎么能从父片段中询问这个问题呢。它应该类似于notifyOnTutorialPageSelected=(notifyOnTutorialPageSelected)getChildFragment()@dex我刚刚更改了它,它仍然说我的主要活动必须实现该接口,而不是childit,但我没有显示所有代码,主活动包含TutorialFragment,其中包含由以下原因引起的childFragmenterror:java.lang.IllegalArgumentException:com.example.example.example。MainActivity@3d1d095必须实现接口NotifyOnTutorialPageSelected@kobbycoder您没有正确设置活动和片段。正如我所提到的,您自己抛出该异常,因为您的活动和父片段没有实现您所期望的接口。那么onTabSelected是如何工作的呢?你能给我举个例子吗?你目前编写代码的方式对我来说毫无意义。你能在你的问题中添加你要添加片段的代码吗?
@Override
public void onPageSelected(int position) {
multiTabFragment.notifyOnTutorialPageSelected(position); // do something so can communicate with the child fragment
}