【发布时间】:2016-03-18 02:05:07
【问题描述】:
我试图在两个片段中进行交流,主要片段和子片段。但是,当我在子片段中声明接口以将值传递给主片段时,它可以正常工作,但是当我想从主片段传递给子片段时,它不起作用。顺便说一句,片段在我的 MainActivity 中。 感谢您的帮助。
错误信息是:
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);
}
}
FIRST CLASS(由 MainActivity 调用)
public class TutorialFragment extends Fragment implements ViewPager.OnPageChangeListener, OnTabSelected {
FragmentManager fragmentManager;
MultiTabFragment multiTabFragment;
NotifyOnTutorialPageSelected notifyOnTutorialPageSelected;
View tab ;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_tutorial, container, false);
fragmentManager = getChildFragmentManager();
multiTabFragment = (MultiTabFragment) fragmentManager.findFragmentById(R.id.multi_tabs_frag);
tab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//Log.e("clicked tab# ", "" + tabIndex);
onTabSelected.onTabSelected(tabIndex);
}
});
return view;
}
@Override
public void onPageSelected(int position) {
notifyOnTutorialPageSelected.notifyOnTutorialPageSelected(position); // do something so can communicate with the child fragment
}
@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());
}
}
@Override
public void onDetach() {
notifyOnTutorialPageSelected = null;
super.onDetach();
}
@Override
public void onTabSelected(int index) {
Log.e("INDEX_PASSED", "" + index);
pager.setCurrentItem(index);
}
}
第二类(由 TutorialFragment 调用)
public class MultiTabFragment extends Fragment implements NotifyOnTutorialPageSelected{
private OnTabSelected onTabSelected;
final int totalTabs = 4;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.multi_tab_fragment, container, false);
//...
return view;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (getActivity() instanceof OnTabSelected) {
onTabSelected = (OnTabSelected) getActivity();
} else if (getParentFragment() instanceof OnTabSelected) {
onTabSelected = (OnTabSelected) getParentFragment();
} else {
throw new IllegalArgumentException(activity + " must implement interface " + OnTabSelected.class.getSimpleName());
}
}
@Override
public void onDetach() {
onTabSelected = null;
super.onDetach();
}
@Override
public void notifyOnTutorialPageSelected(int index) {
deselectPreviousTab(index);
}
解决方案:
由于没有人回答这个问题,如果有人有类似的困难,我会在这里留下答案。我通过实现 MainActivity 的接口解决了这个问题,因此主活动将调用子类并调用方法:
//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);
}
}
它对我有用,或者至少对我想要的有用,如果有人有不同的解决方案,请告诉我,谢谢。
【问题讨论】:
-
Here 已经回答了您的问题!
-
谢谢你!我现在试试
-
notifyOnTutorialPageSelected = (NotifyOnTutorialPageSelected) getParentFragment();如果您的 notifyOnTutorialPageSelected 由子片段实现,您如何从父片段中询问该内容。它应该类似于 notifyOnTutorialPageSelected = (NotifyOnTutorialPageSelected) getChildFragment();
-
@dex 我刚刚更改了它,它仍然说我的主要活动必须实现该接口而不是子接口
标签: java android android-fragments interface