FragmentTransaction.replace()淡入过渡显示“幽灵”片段

问题描述 投票:16回答:1

您可以下载我的整个项目以进行调试。这是我整个代码的回购:https://bitbucket.org/lexic92/studio48/


当我尝试用空白片段替换空白片段时,过渡中出现“幽灵碎片”。

如何重现问题:我有一个导航抽屉,当我单击一个项目时,它将打开一个片段,该片段会填满整个屏幕。

导航抽屉:

  • 按钮1-带有文本的片段
  • 按钮2-空片段

    1. 当我打开应用程序时,它以带有文本的片段开始。然后,我打开导航抽屉,然后单击按钮2。过渡不正确,并变成一秒钟的空白屏幕,然后切换回淡色文本,直到变成空白屏幕。

    2. 如果我打开导航抽屉并单击按钮2 再次,它将从全文淡出到空白屏幕。因此,一秒钟,它在不应该的时候显示带有文本的片段。我在调试模式下逐步运行了我的应用程序,以使其变慢并验证此行为是否确实发生。

    3. 如果我打开导航抽屉并第三次单击按钮2 再次,则它正确地不显示任何动画,因为它正在淡入同一屏幕。

      ] >>
  • 有人知道为什么会这样吗?您是否认为这与导航抽屉有关?

这是我所有代码的回购:

https://bitbucket.org/lexic92/studio48/

以下是一些代码摘录:

SongDetailActivity.java:

      @Override
      public void onNavigationDrawerItemSelected(int position) {
        // update the main content by replacing fragments
        FragmentManager fragmentManager = getSupportFragmentManager();

        //OPEN THE BLANK SCREEN
        if(position == 1) {
            fragmentManager.beginTransaction()
                    //.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .replace(R.id.songlist_detail_container, PlaceholderFragment.newInstance(position + 1, mSongId))
                    .commit();
        }
        //OPEN THE SCREEN WITH TEXT
        else {
            SongDetailFragment sdf = new SongDetailFragment();
            Bundle args = new Bundle();
            args.putString(SongDetailFragment.ARG_ITEM_ID, mSongId);
            sdf.setArguments(args);
            fragmentManager.beginTransaction()
                    //.setCustomAnimations(R.anim.fade_in, R.anim.fade_out)
                    .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE)
                    .replace(R.id.songlist_detail_container, sdf)
                    .commit();
        }
    }

[当我注释掉说两句“ .setTransition”并取消注释说两句“ .setCustomAnimations”时,会发生同样的问题。这是自定义动画:

res / anim / fade_out.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="1.0" android:toAlpha="0.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

res / anim / fade_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <alpha android:fromAlpha="0.0" android:toAlpha="1.0"
           android:duration="@android:integer/config_mediumAnimTime" />
</set>

如何获得平滑过渡而又不出现“鬼影”片段?

规格:

我正在Google Nexus 5物理设备(不是模拟器)上使用android.support.v7.app.ActionBarActivity,minSdkVersion == 15和targetSdkVersion == 21运行。

我对答案的猜测:

该网站似乎给我一个提示:http://gotoanswer.com/?q=Android+Animation+within+a+Fragment+not+working

就我个人而言,这是zPosition for Fragment的错误动画。

您看到的是新片段“出现”,这是因为新片段片段附加在当前片段的下面。

因此,当尝试为现有片段的“上方”动画时,碎片,似乎什么也没有发生,然后新的“出现”。

我已经尝试了许多变通方法,并使用zPosition(仅影响Windows不是布局,因此对片段没有影响),onAnimationCreate()将根布局放在最前面,甚至在动画开始时停止...似乎无能为力。

因此,此时无需编写完整的自定义动画对于片段过渡,目前它们尚有一些漏洞。

您可能需要玩。 .add(Fragment)等待它被添加,然后调用.remove(Fragment)删除旧片段,这样新的片段实际上位于现有片段的顶部。

我确实注意到在实例化SongDetailActivity.java时调用了[[此代码

,即使没有单击导航抽屉时也是如此://OPEN THE SCREEN WITH TEXT else { SongDetailFragment sdf = new SongDetailFragment(); Bundle args = new Bundle(); args.putString(SongDetailFragment.ARG_ITEM_ID, mSongId); sdf.setArguments(args); fragmentManager.beginTransaction() //.setCustomAnimations(R.anim.fade_in, R.anim.fade_out) .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) .replace(R.id.songlist_detail_container, sdf) .commit(); }
也许在引用到新片段之前,如引用所示,当前片段正在淡出到这个“底层”片段?

我最终在做什么

注意:我不是要回答这个问题,因为它在技术上不能回答我的问题,但这是我能想到的最佳备份计划解决方案。我尝试查看是否存在

no

动画时问题是否得到解决。 “幽灵碎片”没有出现,但是我did注意到花了一秒钟的时间来加载碎片,看起来很刺耳且丑陋。我想要一个柔滑的应用程序,如果出现no动画时它不平滑,那么即使我did修复了幽灵片段错误,也可能毫无希望。我了解到片段只是越野车(请参阅here)。 我决定隐藏并显示视图。这是我的新代码:

SongDetailActivity.java

//---------- NAVIGATION DRAWER ------------- @Override public void onNavigationDrawerItemSelected(int position) { //HOME if (position == 0) { } //LYRICS else if(position == 1) { findViewById(R.id.lyrics).setVisibility(View.VISIBLE); findViewById(R.id.info).setVisibility(View.INVISIBLE); } //INFO else if(position == 2) { findViewById(R.id.info).setVisibility(View.VISIBLE); findViewById(R.id.lyrics).setVisibility(View.INVISIBLE); } }
我还复制并粘贴了两个片段的布局(空的片段和一个有很多文本的片段),并将其粘贴到同一布局中,作为FrameLayout父级的子代:

fragment_songlist_detail.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:background="#f8bbd0" android:layout_width="match_parent" > <LinearLayout android:id="@+id/lyrics" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> ... </LinearLayout> <LinearLayout android:id="@+id/info" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"> ... </LinearLayout> </FrameLayout>
它很好用,但我只是不知道如何使其淡入淡出。但这是一个单独的堆栈溢出问题。如果有人解决了幻影碎片之谜,我很想知道答案。但是我认为我现在不会浪费时间试图弄清楚,特别是当片段的过渡在过去被证明是越野车时(例如article)。

您可以下载我的整个项目以进行调试。这是我整个代码的一个仓库:https://bitbucket.org/lexic92/studio48/当我尝试...时,我在过渡中出现了“幽灵碎片” ...

android android-fragments android-animation android-transitions
1个回答
0
投票
为您所有的交易调用执行此操作
© www.soinside.com 2019 - 2024. All rights reserved.