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中的一个Activity中添加两个片段

Android - 弹出两个或更多片段但不顶部

如何在两个片段之间传递位图? (我正在使用 Android 导航组件)

Android 使用两个不同的代码片段获取当前位置 NULL

Android片段重叠

带有两个列表片段的可滚动布局