4

我只是想知道,片段创建只能有一个实例或单例吗?
我也经历了谷歌 iosched项目。他们只是创造

Fragment a = new Fragment();

每当他们想要...

假设例如:

public static FragmentManager instance;

    public static FragmentManager getInstance() {
        if (instance == null) {
            instance = new FragmentManager();
        }
        return instance;
    }

    public TestFragment getTestFragment() {
        if (testFragment == null) {
            testFragment = new TestFragment ();
        }

        return  testFragment 
    }
}

我可以在任何地方使用 FragmentManager.getInstance().getTestFragment()进行交易吗?

例如:

getSupportFragmentManager()
    .beginTransaction()
    .replace(R.id.content_frame, FragmentManager.getInstance().getTestFragment())
    .commit();

还是OS自动销毁引用或者一些相关的问题?

4

3 回答 3

3

当您使用时,getSupportFragmentManager().beginTransaction().replace您可以添加第三个参数作为可以用作标签的字符串,因此如果您想恢复以前的片段,您可以使用getSupportFragmentManager().findFragmentByTag(String)这样您就不必创建新片段。

所以它会是这样的

检查片段findFragmentByTag(String)是否存在,如果不存在,创建一个新片段并调用getSupportFragmentManager().beginTransaction() .replace(R.id.content_frame,myFragment,myTag).commit();myTag 是您将在 findFragmentByTag 中使用的字符串。这样您就不会为每种类型创建多个片段。

我希望它有一些意义:)

有关更多信息,请查看

于 2013-06-17T18:39:17.707 回答
2

没有这样的限制。但是,两个片段对象不能具有相同的标签或 ID。

此外,重新附加现有的片段,而不是创建一个新片段,这很好。

MyFragment f = (MyFragment) getFragmentManager().findFragmenByTag("my_fragment");

if(f == null){
  f = Fragment.instantiate(context, MyFragment.class.getName());
}

if(!f.isAdded()){
  //--do a fragment transaction to add fragment to activity, WITH UNIQUE TAG--
  //--Optionally, add this transaction to back-stack as well--
}
于 2013-06-17T18:40:59.857 回答
0

如果您试图确保不会两次或多次添加或替换具有相同“类型”的一个或多个片段,那么您可以使用FragmentManager.BackStackEntry来了解您的哪些片段当前位于堆栈顶部。

String TAG_FIRST_FRAGMENT = "com.example.name.FIRST.tag";
String TAG_SECOND_FRAGMENT = "com.example.name.SECOND.tag";

FragmentManager fragmentManager = getSupportFragmentManager();
if (fragmentManager.getBackStackEntryCount() == 0 || 
    !fragmentManager.getBackStackEntryAt(
        fragmentManager.getBackStackEntryCount() - 1)
    .getName().equals(TAG_SECOND_FRAGMENT)) {
//Now it's safe to add the secondFragment instance

FragmentTransaction transaction = fragmentManager.beginTransaction();
//Hide the first fragment if you're sure this is the one on top of the stack 
transaction.hide(getSupportFragmentManager().findFragmentByTag(TAG_FIRST_FRAGMENT));
SecondFragment secondFragment = new SecondFragment();
transaction.add(R.id.content_frame, secondFragment, TAG_SECOND_FRAGMENT);
//Add it to back stack so that you can press back once to return to the FirstFragment, and
//to make sure not to add it more than once.
transaction.addToBackStack(TAG_SECOND_FRAGMENT);
transaction.commit();

} 
于 2013-10-20T19:49:45.667 回答