Android 片段和后台显示/隐藏

Android 片段和后台显示/隐藏,android,android-fragments,Android,Android Fragments,首先谢谢你看这个。 我有4个碎片。一个是显示菜单的菜单片段。我有两个显示数据和图片列表的列表片段。第四个片段是一个细节片段。 一切开始都很正常 设置: 我点击一个列表按钮,它就会出现,菜单框就隐藏在它后面 我单击列表片段中的一个条目,它使用一个接口传递数据并显示细节片段 我点击后退按钮,一旦它像它应该的那样将我带到列表片段 我再次点击“后退”按钮,它会像它应该的那样显示菜单框 问题: 如果我再次单击列表按钮,列表会显示出来,但菜单片段仍显示在其后面 我假设它与后退步有关,也许我没有正确地使用它。

首先谢谢你看这个。 我有4个碎片。一个是显示菜单的菜单片段。我有两个显示数据和图片列表的列表片段。第四个片段是一个细节片段。 一切开始都很正常

设置:

我点击一个列表按钮,它就会出现,菜单框就隐藏在它后面

我单击列表片段中的一个条目,它使用一个接口传递数据并显示细节片段

我点击后退按钮,一旦它像它应该的那样将我带到列表片段

我再次点击“后退”按钮,它会像它应该的那样显示菜单框

问题:

如果我再次单击列表按钮,列表会显示出来,但菜单片段仍显示在其后面

我假设它与后退步有关,也许我没有正确地使用它。非常感谢您的帮助。如果有人能解释这个问题,那将是令人惊讶的。如果你想让我发布我的conde的任何部分,请让我知道,但我觉得我的问题在于backbackback,这是我的代码中我弄乱backbackback的部分

private Fragment visible;
private Fragment mVisibleCached;
@Override
public void onBackPressed() {
    super.onBackPressed();
    visible = mVisibleCached;

}


我按照你的方法解决了这个问题,它并不优雅,但对我来说很有效

我使用了integer变量和integer的arraylist(整数是片段的ID),而不是您的2个片段

int可见

ArrayList<Integer> cachedVisible= new ArrayList<Integer>();
最后在碎片化的活动中

public void onBackPressed() {
    if(cachedVisible.size()==0){
        finish();
    }else{
    visible = cachedVisible.get(cachedVisible.size()-1);
    cachedVisible.remove(cachedVisible.size()-1);
     }
    setVisibleFragment(visible);
    cachedVisible.remove(cachedVisible.size()-1);   
}

希望它能帮助别人;)

尝试使用ft.replace而不是ft.add,这确实有效,但我也发现了我的问题。我添加了一组日志消息,告诉我可见和mCached片段发生了什么。在细节片段中按两次后,visible和mcached都是列表片段,visible被设置为列表片段。为了在不使用replace的情况下修复它,我可以设置一个从listFragment到片段活动的连接,该活动将mCached设置为menuFragment,而menuFragment始终是backbackback上的下一个。我会发布解决方案,当我得到它的工作。但是谢谢你@rascuache我忘记了替换。我最后做了差不多同样的事情
private void setVisibleFragment(int id) {
if(visible!=0){
        cachedVisible.add(visible);
    }else{
        cachedVisible.add(R.id.home);
    }


   switch (id) {
        case R.id.settings:
        visible=R.id.settings;
        break;
    case R.id.services:
        ft.hide(fm.findFragmentById(R.id.settings_frag));
        ft.hide(fm.findFragmentById(R.id.plugin_frag));
        ft.show(fm.findFragmentById(R.id.service_frag));
        ft.addToBackStack(null);
        ft.commitAllowingStateLoss();
        visible=R.id.services;
        break;
        ....
   }
}
public void onBackPressed() {
    if(cachedVisible.size()==0){
        finish();
    }else{
    visible = cachedVisible.get(cachedVisible.size()-1);
    cachedVisible.remove(cachedVisible.size()-1);
     }
    setVisibleFragment(visible);
    cachedVisible.remove(cachedVisible.size()-1);   
}