4

我正在尝试执行以下操作。创建一个新的片段 B(菜单),将其从右侧滑入,我想将已显示的片段 A 移动(不隐藏或替换!)左侧。 在此处输入图像描述

我从 Fragment B 得到了 Transaction,但 Fragment A 根本没有改变他的位置。好像,我FragmentManager不知道 Fragment A 存在(Fragment A 不是动态添加的,它是在 XML 中定义的)。

  • main_screen_layout-xml

    <RelativeLayout //...
        android:id="@+id/main_screen"
        tools:context=".MainActivity" 
    
      <fragment
        android:id="@+id/map_screen"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        class="com.google.android.gms.maps.SupportMapFragment" >
      </fragment>
    
  • 分片交易

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();            
    ft.add(R.id.main_screen, new MenuFragment(), MENU_FRAGMENT); //adding Fragment B
    ft.setCustomAnimations(R.anim.slide_in_right, R.anim.slide_out_left_cut);       
    ft.addToBackStack(null);
    ft.commit();
    

片段 A 存在于其中FragementManager,我可以隐藏它,但这不是我的目标

Fragment fragmentA = fragmentManager.findFragmentById(R.id.map_screen);
ft.hide(fragmentA); //hide FragmentA

我究竟做错了什么?

一些注意事项:

  • 我正在使用支持库 (android.support.v4.app.FragmentManager..),但在 API 17 上进行测试
  • 如前所述,我没有特别声明 FragmentA FragmentManager(尝试过,但它说 Fragment 已经存在)
  • 片段 A 是(如您在 XML 中看到的)类的谷歌地图SupportMapFragment
  • 动画 XML 正在运行,这就是我没有发布它的原因
4

2 回答 2

1

我不确定这是否正是您要查找的内容,但请查看此滑动菜单库...它允许在移动中心内容片段的同时从左侧或右侧滑入片段。

于 2013-04-26T15:47:51.357 回答
1

解决方案:

创建具有重叠片段的相对布局:

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

    <RelativeLayout
        android:id="@+id/back_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <include layout="@layout/menu_fragment" />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/front_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <fragment
            android:id="@+id/map_screen"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_above="@+id/map_screen_bottom_bar"
            class="com.google.android.gms.maps.SupportMapFragment" >
        </fragment>

并简单地调用.translationX(-1 * mScreenWidth) (mScreenWidth 是我的 ScreenWidth 减去你想要的间隙)。

            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB_MR1) {
                ((RelativeLayout) findViewById(R.id.front_frame)).animate()
                    .translationX(-1 * mScreenWidth);
            } else {
                TranslateAnimation slideOut = new TranslateAnimation(0, -1
                    * mScreenWidth, 0, 0);
                slideOut.setDuration(getResources().getInteger(
                    R.integer.animation_transistion_length_short));
                slideOut.setFillEnabled(true);

                slideOut.setAnimationListener(new AnimationListener() {

                    @Override
                    public void onAnimationStart(Animation animation) {}


                    @Override
                    public void onAnimationRepeat(Animation animation) {}


                    @Override
                    public void onAnimationEnd(Animation animation) {
                        RelativeLayout mView = (RelativeLayout) findViewById(R.id.front_frame);
                        int[] pos = { mView.getLeft() - mScreenWidth,
                            mView.getTop(), mView.getRight(),
                            mView.getBottom() };
                        mView.layout(pos[0], pos[1], pos[2], pos[3]);
                    }
                });

                ((RelativeLayout) findViewById(R.id.front_frame))
                    .startAnimation(slideOut);
            }
于 2013-05-22T16:28:53.893 回答