【问题标题】:Creating a toast in android and specifying the location在android中创建一个toast并指定位置
【发布时间】:2019-01-16 08:35:09
【问题描述】:

我正在开发我的第一个 Android 应用程序,我正在尝试创建一个 toast 并指定我希望它出现的位置。当我使用现在注释的代码时(它没有自定义 toast 的位置),应用程序在模拟器上完美运行,但现在我尝试自定义位置并使用 cmets 下面的代码,应用程序停止运行当我在 UI 中单击用于显示吐司的按钮时。

您知道为什么会这样吗?因为我已经看到非常相似的代码(几乎相同)呈现为正确的,所以这应该可以工作。我知道这是一个非常简单的代码和一个简单的问题,但我仍然无法弄清楚我的代码有什么问题。

这是我onButtonClick上的代码:

public void onClick(View V) {

            // Toast.makeText(QuizActivity.this,
            //                 R.string.correct_toast,
            //                 Toast.LENGTH_SHORT).show();

            Toast t = new Toast(QuizActivity.this);
            t.setText(R.string.correct_toast);
            t.setDuration(Toast.LENGTH_SHORT);
            t.setGravity(Gravity.TOP|Gravity.LEFT,0,0);
            t.show();

        }

【问题讨论】:

  • 您的应用程序的目标 API 是什么?你为什么不使用 Snackbar,因为 Toast 现在有点淘汰了。 Snackbar 用于适应材料设计
  • @RahulMishra 如果他使用最新的 android api 会导致不同的问题,这不是重复的
  • "当我在 UI 中单击时应用程序停止运行" 请发布堆栈跟踪
  • @JohnJoe 我刚刚运行了应用程序,我马上就有了两个按钮。然后,当我单击其中的第一个(仍然使用类似于 cmets 上的代码)时,它会显示一个祝酒词,这正是我所期待的。但是,当我单击另一个按钮(其中包含我修改以使 toast 出现在不同位置的代码)时,应用程序停止运行。

标签: android android-studio android-toast


【解决方案1】:

来自文档:

https://developer.android.com/guide/topics/ui/notifiers/toasts#java

定位 Toast

标准的 Toast 通知出现在屏幕底部附近,水平居中。您可以使用setGravity(int, int, int) 方法更改此位置。这接受三个参数:重力常数、x 位置偏移和 y 位置偏移。

例如,如果您决定吐司应该出现在左上角,您可以这样设置重力:

JAVA

toast.setGravity(Gravity.TOP|Gravity.LEFT, 0, 0);

如果要将位置向右微移,请增加第二个参数的值。要向下微调,请增加最后一个参数的值。

【讨论】:

    【解决方案2】:

    来自https://developer.android.com/reference/android/widget/Toast#Toast(android.content.Context)

    构造一个空的 Toast 对象。您必须先调用 setView(View),然后才能调用 show()。

    您的代码崩溃了,因为您现在使用的是Toast() 构造函数。你需要在show()之前setView(View)。虽然 makeText() 不需要这样做。

    据我了解,makeText() 为您从第二个参数设置文本创建了一个视图。但是构造函数没有,setText() 方法也没有。 setText() 只更新现有文本:

    来自https://developer.android.com/reference/android/widget/Toast#setText(int)

    更新之前使用 makeText() 方法之一创建的 Toast 中的文本。

    这是一个如何做到这一点的示例:

    Custom toast on Android: a simple example

    编辑

    在任何情况下,您都可以使用初始代码创建 Toast,而无需调用 show()

    public void onClick(View V) {
    
            Toast t = Toast.makeText(QuizActivity.this,
                            R.string.correct_toast,
                            Toast.LENGTH_SHORT);
    
    
            t.setGravity(Gravity.TOP|Gravity.LEFT,0,0);
            t.show();
    
        }
    

    编辑 2

    现在您已经编辑了代码,但您正在传递按钮视图。

    【讨论】:

    • 非常感谢,您的回答绝对有帮助。虽然即使使用 setView (View) 它也不起作用(所以我必须进一步探索),现在你的第二个建议非常有效。所以,谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多