通过Tag或Id访问片段之间的区别

时间:2014-01-21 03:31:34

标签: android android-fragments

我知道我可以创建一个片段并通过Tag或Id添加它。是否可以使用任何一个?有什么理由说我应该使用一个而不是另一个?

model = new ModelFragment();

//tag
getSupportFragmentManager().beginTransaction().add(model, "tag").commit();
//id
getSupportFragmentManager().beginTransaction().add( 4, model).commit();

4 个答案:

答案 0 :(得分:5)

ID用于静态片段,即在活动生命周期中您不想修改其状态的片段。

动态添加片段使用标记:

android.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, fragment, TAG);
    ft.commit();

要在代码中的某处获取片段,请使用以下内容:

if(getFragmentManager().findFragmentByTag(TAG)!=null){
      ft.remove(getFragmentManager().findFragmentByTag(TAG));
      ft.commit();  
 }

答案 1 :(得分:1)

我相信如果id是静态Fragment(即通过xml),则只能Fragment添加Fragments。如果您想通过FragmentTransaction动态添加add(),则String的第三个参数为Fragment。提供标记是可选的,但建议您稍后暂停add()

在您显示的ID案例中,Fragment的第一个参数是您要添加Fragment的容器的布局ID,而不是{{1}}本身的ID

答案 2 :(得分:1)

ID用于标识此片段将放入的容器。 Taken from documentation containerViewId此片段所在容器的可选标识符。如果为0,则不会将其放入容器中。
使用此ID,您可以稍后使用findFragmentById检索片段 - 请参阅下文。

标签是片段管理器用于稍后识别和检索片段的标签。通过使用标签,无论哪个容器容纳该片段,都可以识别片段。

ID和标签可以同时使用或单独使用。 FragmentManager可以通过both idtag来识别片段。

答案 3 :(得分:0)

  

我相信您只能将ID添加到片段(如果它是静态片段)(即通过xml)

我认为这是不正确的陈述,因为您可以编写类似以下内容的

mCoordinatorLayout.id = R.id.myview // or View.generateViewId() giving it whatever Id that You can retrieve later on typing: mCoordinatorLayout.id

因此您可以动态设置ID。

我认为TAG的工作方式略有不同(更安全),引入该功能是为了避免在您以编程方式删除或添加View Object时甚至在编译之前就遇到了一些错误(我遇到)! 假设您编写了一些代码,为按钮ID分配了“ viewid” 从现在开始,“ viewid”作为条目保留在R.id文件中,并且该条目链接到已在“引擎盖”下分配了对象编号的Button。 比您删除声明Button的代码(但是'viewid'仍然在那里引用现在不存在的对象!如果您仅将R.id文件中的垃圾不再使用相同的名称再进行编译,那么这可能不是一个大问题。到下一个编译过程中可能会清除不存在的对象的链接) 但... 现在(在下一次编译之前)为实例创建一个FloatingActionButton(这是一个不同的Object),然后为其分配相同的命名ID:“ viewid”。 臭虫!它仍在引用不存在的对象(已从代码Button中删除)。 如果不存在,情况还会更糟-编译期间会出现错误。 但是,假设您添加了另一个类似的View,它可以很好地编译,但是始终导致引用错误对象的意外行为! 我经历了这一点,这浪费了我很多时间...

花了我很多时间才能找出问题所在以及如何解决(清理项目->重建项目->清除缓存并重新启动AS-不确定是否需要所有步骤,但这很有帮助)。

R.id文件只是ID的列表,它还可以包含ID以供将来使用(或意外遗留的垃圾)。 编译器必须在编号上交换ID的字母数字表示形式,然后对视图对象进行编号(1,2,3 ...)。比你可以运行它

findViewById(whatever_id) // where 'whatever_id' under the hood really is an Object number

我猜想在运行时也会发生类似的问题,这就是后来引入TAG的原因(它可能作为字母数字条目留在内存中,而不仅仅是一个更加明确的数字?),该TAG运行了额外的检查机制避免此类错误。 我认为ID可能运行得更快,因为它只是在一个简单的数字上运行而没有花哨的检查,这就是Android开发人员不推荐使用ID的原因(也许只是因为自从其首次修订以来,它就深深地位于Android核心中,但这可能只是时间问题?)。

顺便说一句 我已经将该错误报告给了AS,但是他们对此没有采取任何措施,也许是因为我的评分不高,所以请告诉他们您是否可以,因为它是一个严重的错误。