是否可以全局使用公共片段生成函数?

时间:2015-06-15 07:50:53

标签: java android android-fragments global

我有常见的片段生成函数,如下所示:

// Common Fragment generation method
public void generateFragment(String speechString, String buttonString) {

    // Store data to be passed to the fragment in bundle format
    Bundle args = new Bundle();
    args.putString("Speech", speechString);
    args.putString("ButtonTitle", buttonString);

    // Instantiate Speech fragment and set arguments
    SpeechFragment newFragment = new SpeechFragment();
    newFragment.setArguments(args);

    // Dynamically add fragment to view using fragment transaction
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, newFragment);
    transaction.commit();
}

我让这个功能在我的一个活动中多次使用。现在,我发现这个功能可以用于我的另一个活动 我也有全局变量类,但它扩展了Application。是的我知道全局变量或全局函数应该在扩展Application类的类中声明 因此,我不能将包含getSupportFragmentManager()的函数与活动相关联作为全局函数。

有没有人知道在活动之间使用这样的功能?

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将片段管理器传递给方法:

public static void generateFragment(FragmentManager fragmentManager, String speechString, String buttonString)

我会像其他人建议的那样避免使用BaseActivity,因为它限制了您可以延伸的范围:例如FragmentActivityActionBarActivityListActivityPreferenceActivity,e.t.c。 谷歌“继承的构成”,看看为什么这是一个糟糕的方法。

真的,您可能想要做的是将此方法拆分。

在SpeechFragment.java中:

public static SpeechFragment newInstance(String speechString, String buttonString) {
    // Store data to be passed to the fragment in bundle format
    Bundle args = new Bundle();
    args.putString("Speech", speechString);
    args.putString("ButtonTitle", buttonString);

    // Instantiate Speech fragment and set arguments
    SpeechFragment newFragment = new SpeechFragment();
    newFragment.setArguments(args);
    return newFragment;
}

然后,SpeechFragment类将负责如何启动自己。 方法的其余部分

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, SpeechFragment.newInstance(speechString, buttonString);
transaction.commit();

然后可以只是使用此Fragment的类的一部分。然后,您可以灵活地更改容器ID,FragmentManager将使用它(可以使用片段的子FragmentManager),添加/附加等而不是替换 - 取决于该片段在活动中的使用方式。