【问题标题】:Android compare two fragmentsAndroid比较两个片段
【发布时间】: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();
    }
}

【问题讨论】:

  • 如果在同一班??

标签: android fragment


【解决方案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)
    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多