是否可以仅使用一个实例创建片段

Posted

技术标签:

【中文标题】是否可以仅使用一个实例创建片段【英文标题】:Can fragment be created with only one instance 【发布时间】:2013-06-13 19:25:47 【问题描述】:

我只是想知道,片段创建是否可以只有一个实例或单例? 我也经历了 Google 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自动销毁引用或者一些相关的问题?

【问题讨论】:

【参考方案1】:

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

原来是这样的

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

我希望它有一些意义:)

更多信息请查看this和this

【讨论】:

就我而言,findFragmentByTag 总是返回 null。我必须在提交之前添加 transaction.addToBackStack(null),如此处回答中所述:***.com/a/27988182/96313【参考方案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--

【讨论】:

【参考方案3】:

如果您试图确保不会两次或多次添加或替换具有相同“类型”的一个或多个片段,那么您可以使用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();

 

【讨论】:

以上是关于是否可以仅使用一个实例创建片段的主要内容,如果未能解决你的问题,请参考以下文章

创建片段而不从 java 代码实例化它

如何防止创建相同片段的 2 个实例?

是否可以在OnStop()上回收所有数据并使用保留片段?

Android - 试图实例化一个不是片段的类

DialogFragment:创建片段时仅显示一次动画

可以更新片段而不是创建新实例吗?