Android使用带有片段的backbackback

Android使用带有片段的backbackback,android,gridview,android-fragments,back-stack,Android,Gridview,Android Fragments,Back Stack,今天我在使用android时遇到了另一个问题 首先,我有一个应用程序,它有一个登录活动。因此,当我的凭证正确时,我会使用意图启动一个新的活动。现在你看到一个tabbar。当我调用我的onTabSelected()方法时,我删除了当前片段,并显示一个gridview。如果我点击这个gridview中的一个元素,片段就会被替换,我的应用程序就会深入到另一个片段中(一个带有另一个细节片段的可扩展列表) 因此,我的问题是,如果我现在点击后退按钮,应用程序将返回到我的第一个活动(登录活动),而不是最后一个

今天我在使用android时遇到了另一个问题

首先,我有一个应用程序,它有一个登录活动。因此,当我的凭证正确时,我会使用意图启动一个新的活动。现在你看到一个tabbar。当我调用我的onTabSelected()方法时,我删除了当前片段,并显示一个gridview。如果我点击这个gridview中的一个元素,片段就会被替换,我的应用程序就会深入到另一个片段中(一个带有另一个细节片段的可扩展列表)

因此,我的问题是,如果我现在点击后退按钮,应用程序将返回到我的第一个活动(登录活动),而不是最后一个片段,即网格视图

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
    FragmentManager fm = getFragmentManager();
    Fragment frag = fm.findFragmentById(R.id.container);
    FragmentTransaction tr = fm.beginTransaction();


    switch (tab.getPosition()) {
    case 1: {//Produkte
        ProdukteGrid pg = new ProdukteGrid();           

        if(frag != null)
            tr.remove(frag);

        tr.add(R.id.container, pg,pg.getTAG());
        tr.addToBackStack(pg.getTAG());
    }

。。。 我的网格:

public View onCreateView(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图v=充气机。充气(R.layout.produkte_gridmain,容器,假);
mGV=(GridView)v.findViewById(R.id.GridView 1);
mGV.setAdapter(新的ImageAdapter(getActivity(),CATEGORY));
mGV.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父视图、视图v、,
内部位置,长id){
FragmentManager fm=getFragmentManager();
Fragment frag=fm.findFragmentById(R.id.container);
FragmentTransaction tr=fm.beginTransaction();
开关(位置){
案例0:{
//startActivity(新意图)(MyGrid.this,
//MainActivity.class);
ProdukteList f=新的ProdukteList();
tr.remove(frag);
tr.add(R.id.container,f,f.getTAG());
tr.addToBackStack(f.getTAG());
}
打破
}
tr.commit();
}
});
返回v;
}
我的主要布局

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

</FrameLayout>

我希望你能帮助我……)

编辑

为了更好地理解,我添加了一张图片:
您应该使用
替换
而不是
删除
添加
片段

与此相反:

tr.remove(frag);
tr.add(R.id.container, f,f.getTAG());
使用以下命令:

tr.replace(R.id.container, f,f.getTAG());

并检查是否在您的活动上覆盖了
onBackPressed
事件。检查代码,确保您没有手动完成活动。

请尝试替换片段,而不是删除和添加:

   fragmentTransaction.replace(..............);
    transaction.addToBackStack(null);
    fragmentTransaction.commit();

如果它能帮助你,我通常会这样做:

AlbumGridFragment fragment = new AlbumGridFragment();
getSupportFragmentManager().beginTransaction().setCustomAnimations(R.animator.anim_back_right, R.animator.anim_back_left, R.animator.anim_left, R.animator.anim_right)
                .add(R.id.album_fragment, fragment).addToBackStack(MainFragmentActivity.ALBUM_GRID_TAG).commit();
以及回溯,例如:

        FragmentManager fragmentManager = getSupportFragmentManager();
        int stackSize = fragmentManager.getBackStackEntryCount();
        if (stackSize == 0) {
            finish();
        }
        else {
            String fragmentTag = fragmentManager.getBackStackEntryAt(stackSize - 1).getName();
            fragmentManager.popBackStack(fragmentTag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }

这是我的初衷。我这样做了,然后我在几个论坛上读到,尽管使用replace()还是使用remove()和add()可能更好,或者只针对最后一个片段?好的,添加片段应该与我的相同。在代码的哪一部分进行回溯?当按下后退按钮时?是的,我通常在父活动的onBackPressed()重写方法中执行此操作,所以在这种情况下,它会在gridview中吗?
        FragmentManager fragmentManager = getSupportFragmentManager();
        int stackSize = fragmentManager.getBackStackEntryCount();
        if (stackSize == 0) {
            finish();
        }
        else {
            String fragmentTag = fragmentManager.getBackStackEntryAt(stackSize - 1).getName();
            fragmentManager.popBackStack(fragmentTag, FragmentManager.POP_BACK_STACK_INCLUSIVE);
        }