【问题标题】:Calling method inbetween Fragments which are in tabs在选项卡中的片段之间调用方法
【发布时间】:2013-01-07 19:24:49
【问题描述】:

我目前有一些片段都组织在选项卡中,我希望片段 A 调用片段 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 片段的帮助将不胜感激。

谢谢,奥利

【问题讨论】:

  • 你想在什么时候(在什么时候)从片段 B 调用片段 A 的方法?
  • 当我当前正在查看片段 B 并单击该布局内的按钮时。

标签: android methods android-fragments android-activity android-tabhost


【解决方案1】:

您可以只创建一个将由托管 Activity 实现的接口。 Fragment A 会将 Activity 的引用作为这个接口实例,当它要调用 Fragment B 中的函数时,它会调用接口中的函数。 在宿主Activity的接口实现中,Activity会调用Fragment B中的函数。

编辑:

我会举一些例子。

您需要创建一个“Fragment A”将用于调用“Fragment B”中的方法的接口,例如:

public interface FragmentBMethodsCaller{
    void callTheMethodInFragmentB();
}

现在,您需要实施它。假设您的活动称为 HostActivity:

public class HostActivity extends Activity implements FragmentBMethodsCaller{
    ...
    public void callTheMethodInFragmentB(){
         --Implementation--
    }
    ...
}

现在,您需要在 Fragment A 中调用它:

FragmentBMethodsCaller fbmc = (FragmentBMethodsCaller)getActivity();
fbmc.callTheMethodInFragmentB();

祝你好运。

【讨论】:

  • 对不起,我不完全理解你在这里的意思。你的意思是创建一个新的类?创建界面是什么意思?
  • 这可能会有所帮助。这是他试图解释的谷歌指南。 developer.android.com/guide/components/…
  • 但是我在哪里添加片段 B 中的方法调用,我绝不会说片段 b.doTask()。或者是否有任何地方可以参考说明我想要在哪个片段中进行活动。
  • 这仍然无法帮助我找到我需要调用的片段,我无法为片段设置 ID,也无法为其设置标签。那么我该如何调用fragmentB呢??
  • 首先,当您创建创建片段的 TabListeners 时,您对两者(“表”)使用相同的标签,所以请修复它。第二件事,当您创建 TabListener 时,您给他一个标签,它会创建带有标签的片段。只需保存 Fragment B 的标签,并在函数callTheMethodInFragmentB() 中使用此标签找到 Fragment,并调用所需的函数,就像在 TabListener 中一样。 mFragment = mActivity.getFragmentManager().findFragmentByTag(mTag);
猜你喜欢
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2018-04-13
相关资源
最近更新 更多