【问题标题】:How to position a toast in Nougat's multi-window mode?如何在 Nougat 的多窗口模式下定位吐司?
【发布时间】:2017-02-22 10:42:15
【问题描述】:

在使用 Nougat 新的多窗口模式时,我注意到如果我自己的应用在纵向模式的顶部窗口中,Toast 将显示在另一个应用上。

这……一点都不好。所以我尝试将我的Toast 定位在this answer 之后“如何在Android 中更改Toast 的位置?”

toast.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);

不幸的是,Gravity 似乎被解释为“屏幕的重力”而不是“我的窗口的重力”。

如何让Toast 显示在我的窗口底部附近并水平居中?

【问题讨论】:

    标签: android android-toast android-7.0-nougat


    【解决方案1】:

    使用带参数的setGravity方法:xOffset,yOffset。

    Toast toast= Toast.makeText(getApplicationContext(),"Message Toast", Toast.LENGTH_SHORT);
    toast.setGravity(Gravity.TOP|Gravity.CENTER_HORIZONTAL, 0, 0);
    toast.show();
    

    【讨论】:

    • 感谢您的回答,但Gravity.CENTER_HORIZONTAL Toast 横向显示在整个屏幕的中间,这意味着它至少会部分出现在我的第二张图片中的其他应用程序上方。 Gravity.TOP 另一方面,如果我的应用是纵向的并且在较低的窗口中,则会导致问题。就像我说的:重力与整个屏幕有关,与我的窗口无关。
    【解决方案2】:

    我怀疑这是预期的行为。根据Material Design Guidelines,除了没有任何直接的方法可以实现您想要的东西之外,Toast 主要用于传达系统消息,应该出现在屏幕底部。

    我的猜测是,任何系统消息都应该与整个设备相关,并且不一定是特定于应用程序的,因此这种一致的行为是有意义的。也就是说,我可以理解为什么这种行为是不可取的,因为 Toast 最终在其中一个应用程序上占据了几乎 25% 的屏幕......但是,无论 Toast 的位置如何,它都会真正吞噬该屏幕遗产,无论是在您的申请中还是在下面的申请中。

    如果你真的想实现一个解决方法,这里是垂直偏移 Toast 的实现。稍有变化就可以实现横向模式,但它有点笨拙。

    View root = findViewById(R.id.root_main);
    
    int[] xy = new int[2];
    root.getLocationOnScreen(xy);
    
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
    wm.getDefaultDisplay().getMetrics(displayMetrics);
    int devHeight = displayMetrics.heightPixels;
    
    int viewHeight = root.getHeight();
    
    Toast toast = Toast.makeText(getApplicationContext(), "hello", Toast.LENGTH_LONG);
    int yOffset = Math.abs(xy[1] - devHeight + viewHeight) + toast.getYOffset();
    toast.setGravity(Gravity.BOTTOM, 0, yOffset);
    toast.show();
    

    【讨论】:

    • 感谢您的回答,但我认为每个应用程序都可以使用 Toasts 来发送小消息,就像 developer guide for Toast 中的示例所说的那样。如果大家一致认为 Toast 仅用于系统消息,为什么他们要解释如何自定义我的 Toast?我将它们用于“游戏结束”或“将 10 首歌曲添加到播放列表”等内容。
    • (cont) 我认为如果您使用标准 toast 并且用户甚至看不到消息来自哪个应用程序,这真的很糟糕(甚至很危险)。当然,我不想覆盖另一个应用程序的区域。
    • 关于解决方法:你能显示一些代码吗?我想用问题中的小示例应用程序对此进行测试。
    • 这是一个非常公平的观点。我认为 Android 指南有时会非常矛盾,因为他们对“材料设计”进行了大修。不过,更多地扮演魔鬼的拥护者;如果您展示的是用户与您的应用交互的 Toast,那么掩盖他们不与之交互的应用真的是犯罪吗?
    • (+1 因为所有好的想法,即使我没有把我的 Toast 定位)关于“这真的是犯罪吗” - 问题:我可能错了,但我认为用户可以在写邮件(我的窗口)时观看视频(不是我的窗口)。 " 在多窗口模式下,应用程序可以处于暂停状态,但仍对用户可见。即使在暂停时,应用程序也可能需要继续其活动。例如,处于暂停模式但处于暂停状态的视频播放应用程序可见应继续显示其视频。”来自guide on multi-window
    猜你喜欢
    • 2019-07-02
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2023-02-15
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    相关资源
    最近更新 更多