当前位置: 首页 > 知识库问答 >
问题:

Android返回转换5秒后不起作用

危彬彬
2023-03-14

使用AndroidX导航组件,我在两个片段之间创建了一个共享元素转换。第一个片段有一个RecyclerView,第二个片段显示单击元素的详细信息。enter转换始终按预期工作。如果我立即按下“后退”按钮,返回转换就可以工作。但是,如果我在按后退按钮之前等待超过大约5秒,动画就不能正常工作了。

那样的话,根本就没有动画。没有移动,没有褪色,碎片中的一切只是立即出现在原地。

下面是主要片段中的导航代码:

    override fun onClick(deck: SlideDeck, sourceView: View) {
        viewModel.activeDeck = deck
        val extras = FragmentNavigatorExtras(sourceView to "deck_details")
        findNavController().navigate(
            R.id.action_deckListFragment2_to_deckDetailsFragment,
            null,
            null,
            extras
        )
    }

下面是在第二个片段中设置共享元素转换的代码:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        val animation = TransitionInflater.from(requireContext()).inflateTransition(
            android.R.transition.move
        )
        sharedElementEnterTransition = animation
        sharedElementReturnTransition = animation
        binding = FragmentDeckDetailsBinding.inflate(inflater, container, false)
        return binding.root
    }

最后,回到主片段,我不得不推迟enter转换:

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        // Inflate the layout for this fragment
        binding = FragmentDeckListBinding.inflate(inflater, container, false)
        postponeEnterTransition()
        binding.root.doOnPreDraw {
            startPostponedEnterTransition()
        }
        return binding.root
    }

我还必须确保RecolyerView中的每个元素都有一个唯一和一致的transitionName,如下所示:

    <androidx.cardview.widget.CardView
        android:id="@+id/deckDetailsCard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4dp"
        android:layout_marginBottom="0dp"
        android:layout_marginLeft="4dp"
        android:layout_marginRight="4dp"
        app:cardCornerRadius="4dp"
        android:transitionName="@{String.format(@string/transition_name_string, deck.id)}"
        android:onClick="@{() -> itemClickListener.onClick(deck, deckDetailsCard)}">
        ...
    </androidx.cardview.widget.CardView>

再一次,这一切都是希望的工作,除非我在返回到主要片段之前等待超过~5秒。我已经在两个模拟器(SDK 21和28)和一个物理设备(Galaxy S10E)上测试了这个功能。都表现出相同的行为。

共有1个答案

佴保臣
2023-03-14

我想出来了。问题出现在主片段的onviewcreated:

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val deckObserver = Observer<List<SlideDeck>> { deckList ->
            val listener: DeckListOnItemClickListener = this
            val deckListAdapter = DeckListAdapter(requireContext(), deckList,
                listener)
            deckListAdapter.dataSet = deckList
            binding.deckRecyclerView.adapter = deckListAdapter
            deckListAdapter.notifyDataSetChanged()
        }
        viewModel.deckList.observe(viewLifecycleOwner, deckObserver)
    }

你看到了吗?

在收到ViewModel的更改通知之前,我没有为RecyclerView创建适配器。我认为问题是在动画运行之后,RecyclerView才设置了adpater。

因此,我使适配器成为片段的成员,直接在onviewcreated中设置RecyclerView的adapter成员,然后在观察到更改时更新适配器的列表。那好像修好了。

 类似资料:
  • 问题内容: 我试图通过将其旋转10度来变换菜单项。我的CSS在Firefox中可以使用,但是我无法在Chrome和Safari中复制效果。我知道IE不支持CSS3属性,所以这不是问题。 我使用以下CSS: 有人可以建议我要去哪里错吗? 谢谢。 问题答案: 这只是一个有根据的猜测,而没有看到其余的HTML / CSS: 您申请了还是申请了?如果没有,请尝试。 否则,请尝试应用CSS3转换规则。

  • 我使用这个MCP3561,没有外部时钟(MCLK),也没有使用中断(irq)(都是浮动的)。 数据表 我最初试图运行快速命令来获取adcdata,但它全部返回0. 然后我试图相应地设置所有配置位,并且当读取adcdata时,它仍然返回数据的所有0。但是在读取所有地址的增量中,我可以看到配置中的数据很好。 我的阅读功能: 我读到的数据是: r_buf[3]返回写入的配置0和。。。。以r_buf[28

  • 问题内容: 我正在开发可访问性应用程序。当用户想要离开该应用程序时,我会显示一个对话框,在该对话框中他必须确认要离开,如果5秒钟后他仍未确认,则该对话框应自动关闭(因为用户可能意外打开了该对话框)。这类似于在Windows上更改屏幕分辨率时发生的情况(会出现警报,如果您没有确认,它将恢复为以前的配置)。 这是我显示对话框的方式: 显示对话框后5秒钟如何关闭对话框? 问题答案:

  • 问题内容: 作为稍微复杂的脚本的一部分,我需要告诉服务器运行模拟。通常,我会这样做。但是,这样做会使ssh会话保持活动状态,直到完成为止,这对我来说是不希望的。 我最近了解了该命令,它似乎很适合我的问题。 我现在要执行的操作是将ssh插入服务器,并在5秒钟内运行模拟脚本(足够多的时间关闭ssh连接)。因此,一旦ssh连接在5秒钟内关闭,服务器将启动仿真,而无需ssh连接保持活动状态。 我遇到的麻烦

  • 问题内容: 我以为我有一种快速的方法来将“唯一标识符”值转换成Big Int,然后再转换回来。但是在我的第二次转换中有一个问题。任何人都可以评论将GUID完全转换为数字并返回的正确方法吗?当我尝试将其从数字表示形式转换回其原始GUID时,我只是得到了GUID的一部分,而不是全部。 我想将一个整数(我认为它将在MSSQL中归类为“ Large BigInt”?)传递给远程系统,仅使用字符0-9,并且

  • 问题内容: 我是android开发的新手,现在我的启动器活动仅显示5秒钟,之后我要检查用户是否已登录并无法正常工作并执行操作。 这是我的代码。 问题答案: 您可以使用Handler来添加一些延迟。按如下所示调用方法,使其在5秒钟后执行。 注意: 请勿使用那样的线程, 因为它将阻塞您的UI并使其无响应。