安卓提示框在屏幕上移动

15

我的安卓应用程序显示了几个 Toast 消息。我最近在运行 Android 5.1.1 的 Galaxy S6 上安装了它,并注意到这些消息最初会显示在屏幕中心附近,然后移动到正确的位置(如果没有指定重力,则靠近底部),最后在淡出之前回到原来的位置。

Context context = getApplicationContext();
String newMsg = getString(R.string.wild_card_msg);
Toast mToast = Toast.makeText(context, newMsg, Toast.LENGTH_LONG); 
mToast.setGravity(Gravity.CENTER, 0, 0);
mToast.show(); 

更新:

  • 我已经升级了支持库,并将编译SDK和目标SDK设置为最新的API。但是这并没有解决问题。
  • 我已经删除了所有的.setGravity()调用,但没有改变。
  • 我注意到Toast消息在首次安装后的第一次执行中表现正常(无论是通过USB调试模式还是从PlayStore下载),但在所有后续运行中问题会再次出现。
  • 我还发现,如果我触摸屏幕(任何地方),我的Toast消息会立即消失。我认为Toast显示不受用户交互的影响。

有没有其他人遇到过这个问题,知道如何修复它或者知道一个解决方法?

请注意,我接受了Nick的答案,提出使用snackBar作为临时解决方法。


3
请提供您用来显示Toast的代码。这确实非常奇怪。 - David Medenjak
2
我遇到了完全相同的问题。不仅是在 Toast 上,任何使用动画的东西都有同样的问题。在新安装后的第一次运行中正常工作,然后在那之后就会出现问题。到目前为止,它似乎只会在 S6 或 S6 edge 上发生。提示:如果我关闭动画,我的快速菜单动画问题就会消失。但是,对于 Toast 来说,这是不可能的,因为它们的动画无法关闭。此外,即使是默认的 Toast 也有相同的问题。重力和自定义视图不会影响此问题。 - theJosh
移除此行代码:mToast.setGravity(Gravity.CENTER, 0, 0); - Haniyeh Khaksar
可能是框架问题,创建用于Toast的窗口被调整大小,导致窗口大小改变,根据重力重新计算视图。这只是一个猜测。似乎避免这种情况的一种方法是在HTC上转向对话框,除非您想重写具有自定义动画的自定义Toast..如果这是可能的话。 - JoxTraex
如果所有动画都出现这种情况,我想这可能是一个测量问题,请您发布它发生的布局(以及您编程添加/创建视图的任何代码)。 - Nick Cardoso
显示剩余10条评论
3个回答

7
你的问题要求提供解决方案或变通方法。在我看来,最简单的变通方法也是最好的选择,因为它可以让你使用更现代化的组件:切换到 Snackbar。
简单 Snackbar:
//on a fragment you can simply use getView(), otherwise give it the root view of your
//layout so that the snackbar can use it to find context

Snackbar.make(getView(), "The toast text", Snackbar.LENGTH_SHORT).show();

这是为了兼容性而存在于支持设计库中。

这是一个消息提示框:

enter image description here

可以在gradle中包含的一些支持/设计库如下:

compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
compile 'com.android.support:appcompat-v7:23.1.1'

谢谢,我一定想尝试这个选项。我会相应地设置我的程序(我想我需要在Gradle构建脚本中添加编译语句等),测试并分享结果。 - Dior DNA
当然,我会使用我刚刚添加到我的答案中的那些。 - Nick Cardoso
1
我成功地解决了 snackBar 的问题。圆形的 Toast 更加“性感”……但是 snackBar 具有基本相同的功能(并且提供更多的潜力)。最重要的是,它们不会在我的 S6 屏幕上漫游!总之,这是一个很好的解决方法,我正式“接受”了你的答案。谢谢 Nick! - Dior DNA
1
@DiorDNA 这并没有回答问题,Toast 和 Snackbar 不是同一件事情,例如你无法从后台服务中显示 Snackbar。 - M. Reza Nasirloo
你也不应该从后台服务中显示toast。问题是寻找解决跳动toast的方法或避免此问题的解决方法。这是后者,当然回答了问题。 - Nick Cardoso
@Pedram。我还没有放弃你提供的线索(下面是你的答案)。然而,这个(法国)运营商不太可能采取任何行动。你的答案可能在学术上是正确的,但我接受了Nick的答案,因为它提供了一个实用的解决方法。 - Dior DNA

3

这是因为厂商在其产品中部署的定制化Android版本,同样适用于Activity动画, 您可以通过扩展Toast类并提供自己的动画和样式或使用开源库来显示Toast消息,在所有设备上实现期望的行为,对于活动设置自定义动画会在所有设备上创建一个恒定的动画。


谢谢,你的回答听起来很有道理。我遇到问题的两个S6中的一个来自(欧洲)运营商。我会与他们(和其他客户)核实。至于你回答中的其余部分,我知道有自定义选项,但我想先让标准Toast(或等效物)正常工作。 - Dior DNA

-2

尝试一下这个简单的Toast

Toast.makeText(getApplicationContext(),"Your message", Toast.LENGTH_SHORT).show();

@Rajen他没有说他尝试过这样做,他说他尝试过使用“this”、“activity”等。让他评论一下他是否尝试过这个。 - Tara
检查一下:“(我没有看到上面的“编辑”...谢谢你为我做了那个)。在上面的具体示例中,我设置了一个特定的重力,以避免隐藏用户希望保持可见的屏幕的相关部分。然而,这可能与奇怪的行为无关,因为即使是没有重力的简单Toast语句也会发生这种情况。” - Dior DNA 2月5日18:15 - Rajen Raiyarela
@Tara(和Rajen)。谢谢。事实上,我也尝试了建议的形式,但没有成功。 - Dior DNA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接