我目前有几个片段都在tab中组织,我想要片段A来调用frag B中的方法。所以我知道我需要调用活动,然后调用B中的函数,我看到有人提到使用
ExampleFragment fragment = (ExampleFragment)
getFragmentManager().findFragmentById(R.id.example_fragment);
fragment.<specific_function_name>();
我遇到了一个问题,因为我的片段添加了一个标签监听器,而不是一个片段管理器,所以我不知道如何使用它来调用方法。以下是我的标签添加方式。
public class fifaActivity extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ActionBar bar = getActionBar();
bar.setTitle(TourneyName);
bar.setDisplayHomeAsUpEnabled(true);
bar.setIcon(R.drawable.fifa);
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.addTab(bar
.newTab()
.setText("Tables")
.setTabListener(
new TabListener<fifa.tables>(this, "tables",
fifa.tables.class)));
bar.addTab(bar
.newTab()
.setText("Knockouts")
.setTabListener(
new TabListener<fifa.knockouts>(this, "tables",
fifa.knockouts.class)));
if (savedInstanceState != null) {
bar.setSelectedNavigationItem(savedInstanceState.getInt("tab", 0));
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("tab", getActionBar().getSelectedNavigationIndex())
}
public static class TabListener<T extends Fragment> implements
ActionBar.TabListener {
private final Activity mActivity;
private final String mTag;
private final Class<T> mClass;
private final Bundle mArgs;
private Fragment mFragment;
public TabListener(Activity activity, String tag, Class<T> clz) {
this(activity, tag, clz, null);
}
public TabListener(Activity activity, String tag, Class<T> clz,
Bundle args) {
mActivity = activity;
mTag = tag;
mClass = clz;
mArgs = args;
mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
if (mFragment != null && !mFragment.isDetached()) {
FragmentTransaction ft = mActivity.getFragmentManager()
.beginTransaction();
ft.detach(mFragment);
ft.commit();
}
}
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (mFragment == null) {
mFragment = Fragment.instantiate(mActivity, mClass.getName(),
mArgs);
ft.add(android.R.id.content, mFragment, mTag);
} else {
ft.attach(mFragment);
}
}
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (mFragment != null) {
ft.detach(mFragment);
}
}
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
}
如何从fifa.tables片段调用方法到fifa.knockouts片段的任何帮助将非常感激。
谢谢,Oli
答案 0 :(得分:1)
您可以创建一个将由托管活动实现的界面。 片段A将作为此接口实例保持对Activity的引用,并且当它想要在片段B中调用该函数时,它将在接口中调用该函数。 在托管活动的接口实现中,Activity将调用Fragment B中的函数。
编辑:
我将展示一些例子。
您需要创建一个'Fragment A'用于调用'Fragment B'中的方法的界面,例如:
public interface FragmentBMethodsCaller{
void callTheMethodInFragmentB();
}
现在,您需要实现它。假设您的活动名为HostActivity:
public class HostActivity extends Activity implements FragmentBMethodsCaller{
...
public void callTheMethodInFragmentB(){
--Implementation--
}
...
}
现在,你最后需要在片段A中调用它:
FragmentBMethodsCaller fbmc = (FragmentBMethodsCaller)getActivity();
fbmc.callTheMethodInFragmentB();
祝你好运。