Android比较两个片段
Posted
技术标签:
【中文标题】Android比较两个片段【英文标题】:Android compare two fragments 【发布时间】:2013-08-26 17:21:20 【问题描述】:当我更改片段时,我想将新片段与当前片段进行比较。如果相同,则无需更换。
我试过了
public void displayFragment(Fragment fragment)
FragmentManager fm = getSupportFragmentManager();
Fragment currentFragment = fm.findFragmentById(R.id.content_frame);
if(!currentFragment.equals(fragment))
getSupportFragmentManager().beginTransaction().addToBackStack(null).replace(R.id.content_frame, fragment).commit();
但它不起作用,即使新的片段相同,片段也会改变
解决方案? 谢谢
编辑
解决办法:
public void displayFragment(Fragment fragment)
FragmentManager fm = getSupportFragmentManager();
Fragment currentFragment = fm.findFragmentById(R.id.content_frame);
if(!fragment.getClass().toString().equals(currentFragment.getTag()))
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content_frame, fragment, fragment.getClass().toString()) // add and tag the new fragment
.commit();
【问题讨论】:
如果在同一班?? 【参考方案1】:识别片段的一种方法是给它们标记:
public void displayFragment(Fragment fragment, String tag)
FragmentManager fm = getSupportFragmentManager();
Fragment currentFragment = fm.findFragmentById(R.id.content_frame);
if(!tag.equals(currentFragment.getTag())
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content_frame, fragment, tag) // add and tag the new fragment
.commit();
edit : psv 评论的替代版本,使用类名作为标签:
public void displayFragment(Fragment fragment)
FragmentManager fm = getSupportFragmentManager();
Fragment currentFragment = fm.findFragmentById(R.id.content_frame);
if(!fragment.getClass().toString().equals(currentFragment.getTag()))
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content_frame, fragment, fragment.getClass().toString()) // add and tag the new fragment
.commit();
【讨论】:
是的!非常感谢 !为了避免每次更改片段时都添加标签,我在 public void displayFragment(Fragment fragment) FragmentManager fm = getSupportFragmentManager(); 中修改了您的代码片段 currentFragment = fm.findFragmentById(R.id.content_frame); if(!fragment.getClass().toString().equals(currentFragment.getTag())) getSupportFragmentManager() .beginTransaction() .addToBackStack(null) .replace(R.id.content_frame, fragment, fragment.getClass( ).toString()) // 添加并标记新片段 .commit(); 或者你可以使用instanceof
?保持简单。【参考方案2】:
在 Kotlin 中工作的简单代码。这里的 Fragment_Current() 是一个当前片段。
fun displayFragment(fm: Fragment)
if(fm !is Fragment_Current)
supportFragmentManager.beginTransaction().replace(R.id.ContentFragmentRoot, fm).commit()
【讨论】:
【参考方案3】:根据@alex-fu 的评论,代码应该是这样的:
public void displayFragment(Fragment fragment)
FragmentManager fm = getSupportFragmentManager();
Fragment currentFragment = fm.findFragmentById(R.id.content_frame);
if( !(fragment instanceof currentFragment) )
getSupportFragmentManager()
.beginTransaction()
.addToBackStack(null)
.replace(R.id.content_frame, fragment, fragment.getClass().toString()) // add and tag the new fragment
.commit();
【讨论】:
instanceof
用于检查对象是否属于特定类或接口类型。但是您尝试检查两个对象。它应该是这样的:if(!(fragment instanceof FragmentClassName))
对于 Kotlin 来说是这样的...... if (fragment !is FragmentClassName)以上是关于Android比较两个片段的主要内容,如果未能解决你的问题,请参考以下文章
如何在两个片段之间传递位图? (我正在使用 Android 导航组件)