是否可以仅使用一个实例创建片段
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();
【讨论】:
以上是关于是否可以仅使用一个实例创建片段的主要内容,如果未能解决你的问题,请参考以下文章