Android使用带有片段的backstack

时间:2013-12-13 07:01:58

标签: android gridview android-fragments back-stack

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

首先,我有一个具有登录活动的应用程序。因此,当我的凭据正确时,我会使用意图开始一项新活动。所以现在你看到一个标签栏。当我调用我的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(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View v = inflater.inflate(R.layout.produkte_gridmain, container, false);

    mGV = (GridView) v.findViewById(R.id.gridView1);
    mGV.setAdapter(new ImageAdapter(getActivity(), CATEGORY));

    mGV.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            FragmentManager fm = getFragmentManager();
            Fragment frag = fm.findFragmentById(R.id.container);
            FragmentTransaction tr = fm.beginTransaction();
            switch (position) {
            case 0: {
                // startActivity(new Intent(MyGrid.this,
                // MainActivity.class));
                ProdukteList f = new ProdukteList();

                tr.remove(frag);
                tr.add(R.id.container, f,f.getTAG());
                tr.addToBackStack(f.getTAG());
            }
                break;
            }
            tr.commit();
        }
    });
    return 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>

我希望你能帮助我.. :)

修改

为了更好地理解,我添加了一张图片: enter image description here

3 个答案:

答案 0 :(得分:0)

您应该使用replace代替removeadd fragment

而不是:

tr.remove(frag);
tr.add(R.id.container, f,f.getTAG());

使用此:

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

并检查您的活动是否override onBackPressed。检查代码,确保您没有手动完成活动。

答案 1 :(得分:0)

而不是删除并添加尝试替换片段:

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

答案 2 :(得分:0)

如果它可以帮助你,通常我会做这样的过渡:

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();

和BackTrack例如:

        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);
        }