为什么我的 Android 转换忽略 TransitionListener?

2023-12-05

我正在尝试通过调用来平滑更新显示TransitionManager.beginDelayedTransition(viewGroup, new AutoTransition())在更新显示之前。但我发现有时我快速更新显示,Android 会变得混乱。

所以我添加了一个TransitionListener to the AutoTransition where transitionEnd()回调,表示转换已完成,此时我将动画设置为屏幕的新状态。但我发现通常这甚至没有被调用。

当 a) 转换结束或 b) 转换从未被调用时,是否有某种方法可以回调回调?


更多信息:

我正在使用 Xamarin.Android。我有一段代码看起来像这样,它启动了转换:

if (animated && viewGroup != null && Utils.Api19PlusKitkat) {
    App.Log("** Beginning animation.");
    var transition = new AutoTransition();
    transition.AddListener(new TransitionListener(this));
    TransitionManager.BeginDelayedTransition(viewGroup, transition);
}

TransitionListener 非常简单:

public class TransitionListener : Java.Lang.Object, Transition.ITransitionListener {
    readonly TreeNode owner;

    public TransitionListener(TreeNode owner)
    {
        this.owner = owner;
    }

    public void OnTransitionEnd(Transition transition)
    {
        App.Log("**** TransitionListener: Transition End.");
        owner.FinishTransition();
    }

    public void OnTransitionCancel(Transition transition) {}
    public void OnTransitionPause(Transition transition) {}
    public void OnTransitionResume(Transition transition) {}
    public void OnTransitionStart(Transition transition) {
        App.Log("**** TransitionListener: Transition Start.");
    }
}

当我查看应用程序日志时,我看到很多“开始动画”的情况,但很少见“过渡开始”或“过渡结束”的情况(目前我没有看到任何实例,但有时我看到它发生在日志中)。


Upd2:

我想,我现在明白了。经过两天无果的尝试后,我成功重现了这个问题。

TransitionManager.beginDelayedTransition()会点燃一些东西only当屏幕上有需要更新的内容时。

例如,如果您setOnClickListener with TransitionManager.beginDelayedTransition() in OnClick到没有选择器的具有自定义背景的按钮(android:background="#000",而不是默认选择器)-什么也不会发生,Transition根本不会启动(正如您在案例中看到的那样)。同时,如果您分配相同的OnClickListener到默认样式的按钮(即以选择器作为背景)-Transition will立即开始。

同样,如果您之后进行一些 UI 更改TransitionManager.beginDelayedTransition()被称为:

public void changeScene(View v){
    AutoTransition autoTransition = new AutoTransition();
    autoTransition.setDuration(3000);
    autoTransition.addListener(new Transition.TransitionListener() {
        @Override
        public void onTransitionStart(Transition transition) {
            Toast.makeText(MainActivity.this, "start", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onTransitionEnd(Transition transition) {
            Toast.makeText(MainActivity.this, "end", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onTransitionCancel(Transition transition) {}

        @Override
        public void onTransitionPause(Transition transition) {}

        @Override
        public void onTransitionResume(Transition transition) {}
    });

    TransitionManager.beginDelayedTransition(container, autoTransition);
    findViewById(R.id.btn1).setVisibility(
            (findViewById(R.id.btn1).getVisibility()) == View.VISIBLE?
                     View.INVISIBLE : View.VISIBLE);
}

这将代码片段将工作,因为它应该:

enter image description here

但是,一旦您删除了可见性的设置器,过渡就会添加到backlog of the TransitionManager并且没有执行(方法的名称说 - 它可能是delayed)。并且它只会在下一次 UI 更改期间执行:

enter image description here

在这个例子中,我删除了setVisibility()- 你可以看到结果:“动画”(在我的例子中只是 Toasts)仅在我单击以选择器为背景的按钮后才开始(即发生 UI 更改)。

所以解决办法是——“确保在您调用后有一些 UI 更改TransitionManager.beginDelayedTransition()".

我希望,它有帮助

附:不过有点奇怪的是TransitionManager.go(),写在之后TransitionManager.beginDelayedTransition(),行不通。我在这里找到的唯一解决方法是将其放入其中onTransitionEnd为了延迟过渡。

Upd1:

首先想到的是它可能与 Xamarin 有关。然后我找到了两个使用的例子BeginDelayedTransition在 Xamarin.Android 中:xamarin/monodroid-样本 and 加鲁马/莫约。 要检查您的问题是否与 Xamarin.Android 相关 - 我建议调试这 2 个项目以查看是否TransitionListener触发转换事件。

两个例子都使用TransitionManager.beginDelayedTransition()带有一个参数(viewGroup)。检查源代码 of TransitionManager显示,该 1 参数方法正在调用beginDelayedTransition(sceneRoot, null);

public static void beginDelayedTransition(final ViewGroup sceneRoot) {
    beginDelayedTransition(sceneRoot, null);
}

并将 null 替换为sDefaultTransition:

private static Transition sDefaultTransition = new AutoTransition();
....
public static void More ...beginDelayedTransition(final ViewGroup sceneRoot, Transition transition) {
    if (!sPendingTransitions.contains(sceneRoot) && sceneRoot.isLaidOut()) {
        if (Transition.DBG) {
            Log.d(LOG_TAG, "beginDelayedTransition: root, transition = " +
                    sceneRoot + ", " + transition);
        }
        sPendingTransitions.add(sceneRoot);
        if (transition == null) {
            transition = sDefaultTransition;
        }
        final Transition transitionClone = transition.clone();
        sceneChangeSetup(sceneRoot, transitionClone);
        Scene.setCurrentScene(sceneRoot, null);
        sceneChangeRunTransition(sceneRoot, transitionClone);
    }
}

所以要调试它,你必须获得默认值TransactionManager.getDefaultTransition()并添加你的TransitionListener进去。

如果它有效 - 那么我们必须在您的代码中找到问题。如果它不起作用 - 好吧..然后,大概我们发现了一个系统错误,我们可以将其归档。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我的 Android 转换忽略 TransitionListener? 的相关文章

  • 如何在android中实现触摸平滑图像橡皮擦?

    我已经从 API 演示中看到了finturePaint java 我想实现触摸平滑橡皮擦 通过在android中触摸移动来擦除部分图像 FingerPaint 告诉我要实现这个 mPaint setXfermode new PorterDu
  • 我在布局上看不到任何 FirebaseRecyclerAdapter 项目

    我试图将数据从 Firebase 数据库检索到我的布局 但我看不到任何项目FirebaseRecyclerAdapter在布局中 请帮忙 我按照一个教程展示了如何做到这一点 当我运行应用程序时 我没有看到任何项目 但我可以滚动 public
  • 从响应中获取标头(Retrofit / OkHttp 客户端)

    我正在使用 Retrofit 与 OkHttp 客户端和 Jackson 进行 Json 序列化 并希望获取响应的标头 我知道我可以扩展 OkClient 并拦截它 但这发生在反序列化过程开始之前 我基本上需要的是获取标头以及反序列化的 J
  • Android Studio:XML 布局中的“包装在容器中”

    编辑 XML 布局文件时 Eclipse 有一项称为 包裹在容器中 的功能 重新格式化 gt Android gt 可让您选择一个或多个视图并在其周围包裹您选择的布局 Android Studio中有类似的东西吗 目前正在实施中 问题 69
  • 如何在android中显示保存在sdcard文件夹中的图像[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 当我正在显
  • 按下按钮时应用不同的样式

    有没有办法在按下按钮时将样式应用于按钮 如果我有一种风格样式 xml
  • Gradle 构建错误:无法从 https://repo1.maven.org/maven2/io/fabric/tools/gradle/maven-metadata.xml 加载 Maven 元数据

    我在 Android studio 中遇到 gradle 构建错误 如下所示 Error A problem occurred configuring project MyApp Could not resolve all dependen
  • Android 初学者:Android gridview 中的触摸事件

    我正在使用以下代码来使用 gridview 执行操作 稍作修改http developer android com resources tutorials views hello gridview html http developer a
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • Dialog.setTitle 不显示标题

    我正在尝试向我的对话框添加自定义标题 但是每当我运行我的应用程序时 它都不会显示标题 我创建对话框的代码是 final Dialog passwordDialog new Dialog this passwordDialog setCont
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 图像作为电子邮件附件

    我想构建一个应用程序 我可以在电子邮件中附加图像 打开图像并将其设置为我的壁纸 我想让它跨平台 所以你能告诉我是否可以使用phonegap 或者我是否必须为iphone和android构建一个本机应用程序 您好 如果您只想通过电子邮件附加图
  • 从 BroadcastReceiver 类调用活动方法

    我知道我可以做一个内部接收器类来调用接收器中的任何方法 但我的主要活动太大了 要做的事情也很多 因此 我需要一个扩展广播接收器的类 但它不是内部类 并且可以从我的主要活动中调用一种方法 我不知道是否可能 但我的活动是家庭活动和 single
  • 使用片段时应用程序崩溃

    我正在处理碎片和 我的代码中有一个我找不到的问题 logcat 指向我的一个片段中的这段代码 Override public View onCreateView LayoutInflater inflater ViewGroup conta
  • Android 构建发布失败,原因为:java.lang.ArrayIndexOutOfBoundsException:213(pr​​oguard 问题)

    我的项目使用调试构建变体构建得很好 但使用发布变体 Android Studio 会抛出 引起原因 java lang ArrayIndexOutOfBoundsException 213 可能是什么问题 如果我设置minifyEnable
  • 对于一个单元格,RecyclerView onBindViewHolder 调用次数过多

    我正在将 RecyclerView 与 GridLayoutManager 一起使用 对于网格中的每个项目 我需要调用 REST api 来检索数据 然后 从远程异步获取数据后 我使用 UIL 加载 显示图像 一切似乎都很好 但我发现 on
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 上网本上可以进行Android开发吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想使用我的上网本进行 Android 开发 但是当我尝试使用 Eclipse 运行 SDK 时 没有加载任何内容 上网本对于 Android 开发来
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • Android 后台倒计时器

    我有一个 Android 应用程序 它管理一个倒计时器 类 CountDownTimer 它显示在应用程序屏幕中 以显示到达 00 00 还剩多少时间 我现在的问题是 当我按主页按钮或启动另一个应用程序时 应用程序 计时器不会在后台运行 所

随机推荐

  • 使用 JDBC 的 NLS_DATE_FORMAT

    我尝试在jdbc中设置NLS DATE FORMAT 但似乎没有任何效果 我的代码 Connection conn ods getConnection Statement stat conn createStatement stat exe
  • 尝试创建多个 JLabel,但只出现一个

    我正在尝试创建多个相同形式的 JLabel 然后尝试将它们添加到同一个 JPanel 中 然而 只出现了一个 JLabels 我不明白为什么 这是我写的代码 final JPanel labelPanel new JPanel new Bo
  • API 响应显示带有 PUT/PATCH 请求的过时数据

    我正在使用 Django REST 框架开发 API 就我而言 我使用嵌套序列化器 所以我需要覆盖 update method 这是所需的描述 序列化器 配置串行器 class DeviceConfigSerializer serializ
  • 在 Linux 中的 jvm 中查找硬和软打开文件限制(ulimit -n 和 ulimit -Hn)

    我有一个问题 我需要从 java groovy 程序中找出 Linux 中进程的硬打开和软打开文件限制 当我从终端执行 ulimit 时 它会给出硬打开文件限制和软打开文件限制的单独值 ulimit n 1024 ulimit Hn 409
  • Firebase 云消息传递:FCM 令牌过期

    据我所知 如果发生以下情况之一 FCM 令牌会自行更新 应用程序删除实例ID 该应用程序已在新设备上恢复 用户卸载 重新安装应用程序 用户清除应用程序数据 App端可以使用以下方法来监控Token更新 监控代币生成 每当生成新令牌时都会触发
  • 有没有什么不显眼的方法来挂钩 jQuery 方法的触发器?

    我想知道是否有任何不显眼的方法来挂钩 attr data css 等方法并调用自定义触发器 理想情况下 我可以做这样的事情 friend a bind attr changed changed data function e alert T
  • Android:图像按钮或按钮在按下时突出显示效果

    当我按下这些时left and right arrow button当时我想在按钮上看到这些类型的效果 同样的事情发生在Iphone IOS默认情况下 我可以做出这种效果吗 在这里我提到了我想要的图片 在这里我使用了这个 xml 文件但没有
  • 加载 Google LineChart 动画

    我正在尝试通过添加行和刷新图表来使用过渡动画来实现图表的加载动画 但它的表现与我的预期完全不同 这是小提琴http jsfiddle net jATUX 一些代码 google load visualization 1 packages c
  • 连接/组合 MX1 numpy 数组与 MXN numpy 数组

    required time stamps包含 5911 个时间戳 time based mfcc feature包含 5911 个样本 每个样本具有 20 个 mfcc 特征 所以如果你要看看time based mfcc feature它
  • Mysql 存储过程中循环内的 Select 语句

    我们可以在 Mysql 存储过程的循环中使用 Select 语句吗 为什么代码错误 create procedure AbsentReportproc INOUT fromdate DATETIME INOUT todate DATETIM
  • 如何阻止仅针对 favicon 的 HTTP 请求? [复制]

    这个问题在这里已经有答案了 每个人都知道如何在 HTML 中设置 favicon ico 链接 但愚蠢的是 我们只需要一个几个字节的小图标另一个可能影响速度的 HTTP 请求 所以我想知道 如何使该图标成为可用精灵的一部分 例如 backg
  • MVC4中基于模型值的控件创建

    在我的数据库中 我有一个名为 control id 的列 其中包含 1 2 3 4 等值 基于这个值 我必须生成文本框 下拉列表和复选框等控件 例如 如果我的 control id 为 1 则必须生成文本框 如果为 2 则必须生成下拉列表等
  • 有没有一种简单的方法可以按值删除列表元素?

    我想从列表中删除一个值 如果它存在于列表中 也可能不存在 a 1 2 3 4 b a index 6 del a b print a 上面给出了错误 ValueError list index x x not in list 所以我必须这样
  • 从 SOAP 安全标头获取 X 509 证书

    大家好 我有一个用于 cxf Web 服务 spring 应用程序 的简单存根客户端 它使用 WSS4JOutInterceptor 与action Signature 因此 soap 请求消息是 标头 Content Type text
  • AttributeError:“NoneType”对象没有属性“grid_remove”

    我只用 Tkinter 做了一点工作 我喜欢使用它 但与任何类型编程一样 它需要时间来学习 我正在尝试创建一个简单的待办事项列表 最终将保存在文件中 但我无法删除第 17 行中的按钮并将下一行的按钮替换到不同的位置 from tkinter
  • 在特定列中使用范围查找方法

    我已经对此进行了一段时间的修改 我有下面的代码可以工作 但它的搜索量超出了我的预期 我希望它只搜索 C 列而不是整个工作表 我尝试过改变Cells Find to Range C1 C10000 Find但它不返回任何匹配项 真的被这个难住
  • 如何使用 ksoap 2 对 Web 服务调用强制执行超时?

    我需要向使用 ksoap 2 连接到 Web 服务的 J2ME 应用程序添加超时 我已经尝试过描述为可能的伪超时的方法http ksoap2 sourceforge net doc api org ksoap2 transport Http
  • 从子窗体访问父窗体上的控件

    我想从子表单更改父表单文本框中的文本 我设置了文本框 修饰符 公共 我在父窗体中额外编写了一个函数 public TextBox txtbox get return mybox set mybox value 以儿童形式书写 this Pa
  • InvalidArgumentError:输入必须是向量,形状为:[]

    我正在尝试使用保存文本数据的嵌入universal sentence encoder在 pandas dataframe 新列中但出现错误 这就是我正在尝试做的事情 module url https tfhub dev google uni
  • 为什么我的 Android 转换忽略 TransitionListener?

    我正在尝试通过调用来平滑更新显示TransitionManager beginDelayedTransition viewGroup new AutoTransition 在更新显示之前 但我发现有时我快速更新显示 Android 会变得混