Fragment进入转换的问题

问题描述 投票:0回答:3

我使用的是运行 Android 5.0 的设备,

minSdk
是 21,
targetSdk
是 22。

应用说明

我正在使用一个有 2 个活动的应用程序,活动 A 包含一个带有图片和文本的

GridView
,活动 B 包含一个
ImageView
、一个
TextView
和一个片段。该片段包含与文本关联的图像列表。 当单击活动 A 的图像时,有一个共享元素过渡,它将图像和文本移动到活动 B 的
ImageView
TextView
。我还在活动 A 和 B 之间设置了淡入淡出过渡。片段在
onCreate()
方法中动态添加到活动 B。我设置并进入和退出片段的过渡:

 MyFragment myFragment = new MyFragment();
 myFragment.setEnterTransition(new Slide());
 myFragment.setExitTransition(new Slide);
 getFragmentManager().beginTransaction()
                .add(R.id.container, myFragment, MyFragment.TAG)
                .commit();

关于fragment退出过渡,我使用了一个技巧,当按下后退按钮时,我用另一个fragment替换它以强制它:

@Override
public void onBackPressed() {
    if (myFragment.isVisible()) {
        getFragmentManager().beginTransaction()
                .replace(R.id.container, new Fragment())
                .commit();
    }
    super.onBackPressed();
}

我的应用程序的主题是

Theme.Material
的子主题,所以我没有定义

getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

也不

<item name="android:windowActivityTransitions">true</item>
<item name="android:windowContentTransitions">true</item>

(我尝试过,没有什么区别)。

应用程序问题

我的问题涉及片段进入转换,该转换无法正常工作,而退出转换则工作正常。 我尝试了不同的情况:

  • 没有明确定义的活动转换:没有进入转换,当共享元素转换播放时片段已经存在。
  • 在活动A和B中用java定义一个活动转换:
    
    getWindow().setEnterTransition(new Fade());
    getWindow().setExitTransition(new Fade());
    
    结果与未定义显式活动转换相同。
  • 使用 XML 定义活动转换:
    
    <item name="android:windowEnterTransition">@transition/fade</item>
    <item name="android:windowExitTransition">@transition/fade</item>
    
    结果是片段将通过淡入淡出进入并且
    Fragment.setEnterTransition()
    被忽略。
  • 在 XML 中定义片段进入转换:
    <item name="android:fragmentEnterTransition">@transition/fade</item>
    结果是完全被忽略了,之前的所有情况都会发生同样的情况。

我尝试了其他方法来使其像这样工作:

myFragment.setAllowEnterTransitionOverlap(false);
但什么也没有...... 我还尝试在
ImageView
上设置一个点击监听器,并仅在点击图像时添加片段,它成功了!由此,我认为与 Activity 生命周期相比,片段转换的时机可能存在问题,因此我尝试将代码放入
onResume()
方法中,但仍然没有任何结果。

然后我尝试使用一个

postDelayed()
的方法:

MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
mImageView.postDelayed(new Runnable() {
            @Override
            public void run() {
         getFragmentManager().beginTransaction()
            .add(R.id.container, myFragment, MyFragment.TAG)
            .commit();
            }
        }, 1000);

而且它也有效!

最后我尝试添加一个空片段,然后将其替换为

myFragment

MyFragment myFragment = new MyFragment();
myFragment.setEnterTransition(new Slide());
myFragment.setExitTransition(new Slide);
getFragmentManager().beginTransaction()
                .add(R.id.container, new Fragment)
                .commit();
getFragmentManager().beginTransaction()
                .replace(R.id.container, myFragment, MyFragment.TAG)
                .commit();

但还是什么都没有...

所以现在我想知道是否有什么东西我错过了让它在不使用技巧的情况下工作......而问题是我知道它可以工作,因为我大约 5 个月前开始开发这个应用程序并且它正在工作! !所以我不知道发生了什么,我没有更新我的Android版本。

奖励错误:它仍然与片段进入转换有关。在拥有我之前描述的应用程序之前,我尝试了一个没有共享元素转换的版本。如果我没有为 Activity B 的

TextView
设置转换名称,则该片段将永远不会有进入转换。但和以前一样,如果在 onclicklistener 方法中设置,它就会起作用。我在 2 台运行 Android 5.0.x 的设备上尝试过此操作,但转换不起作用。我在 Android 5.1.1 的设备上尝试过,转换成功了(无需更改代码中的任何内容)!还是不知道发生了什么......

所以我的最后一个问题是:这种行为的解释是什么?有没有一种方法可以使其在不使用技巧的情况下工作?

android android-fragments android-animation android-5.0-lollipop android-transitions
3个回答
3
投票

尝试在 OnCreate 中添加片段的进入和退出转换。这似乎对我有用


0
投票

使用 FragmentTransaction 类中的 setCustomAnimations。

getFragmentManager().beginTransaction() .setCustomAnimations(R.id.inAnim, R.id.outAnim,R.id.inAnim, R.id.outAnim) .replace(R.id.container, myFragment, MyFragment.TAG) .commit();

这样您就可以为每个转换定义一个动画。


0
投票

几年前我一直在以这种方式定义片段转换,现在我也面临这个问题。我查看了我的旧代码并在那里找到了答案。就我而言,布局有几个 ViewGroup,我想为孩子们提供不同的 EnterTransition。对我来说,通过将

android:transitionGroup="false"
添加到布局文件的根容器中解决了问题。

© www.soinside.com 2019 - 2024. All rights reserved.