请在回答标准例程之前阅读问题以打印Toast :)
我想在屏幕的左上角显示自定义Toast.我使用此代码创建Toast:
Toast mFixedToast = new Toast(getApplicationContext());
mFixedToast.setDuration(timeout);
mFixedToast.setView(myInflatedLayout);
mFixedToast.setGravity(Gravity.TOP|Gravity.FILL_HORIZONTAL, 0, 0);
mFixedToast.setMargins(0,0);
Run Code Online (Sandbox Code Playgroud)
然而,在一些设备中,例如三星Galaxy S4,吐司不是位于(0,0),而是具有40-50像素的边缘.许多其他设备按预期工作.
我很肯定WindowManager添加了边距(Toast视图作为TYPE_TOAST类型的视图添加到WindowManager)
这是为什么?可以修改吗?请看下面的代码,我已经将Toast.java克隆到我自己的类中,并隔离了将视图添加到WM的行:
// LayoutParams for the TOAST view ... tried to change params.type but no luck.
final WindowManager.LayoutParams params = mParams;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.windowAnimations = android.R.style.Animation_Toast;
params.type = WindowManager.LayoutParams.TYPE_TOAST;
mWM = (WindowManager)mView.getContext().getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
mParams.gravity = gravity;
// CHECKED these all are 0 !!!
mParams.x = mX; mParams.y = …Run Code Online (Sandbox Code Playgroud) 我正在测试一个应用程序Espresso.我有一个问题是可能要等到目前没有吐司出现.我在我的应用程序中有很多不同的吐司,但是在测试时我遇到了问题,因为据我所知,焦点已经转向吐司,我正在获得另一个视图层次结构,我可以在错误日志中看到.
所以我的问题是可以隐藏所有(系统范围内的root访问权限)或只是等到屏幕上有任何toast,或者是否可以手动将焦点设置到活动视图层次结构.
如果对这个问题有任何帮助,我将不胜感激.
谢谢.
PS禁用toast直接在我的应用程序中的某个地方不是一个选项,因为它为应用程序带来了一些额外的逻辑,这只是在测试时需要.
我已经阅读了几个关于何时使用活动以及何时使用应用程序上下文的讨论(例如在此SO帖子上).
我想知道使用活动或应用程序上下文对Toast.makeText()方法有什么影响.
文档仅简要说明参数context:
上下文:要使用的上下文.通常是您的Application或Activity对象.
我的问题是
还有什么要考虑的?
我正在为Android Auto构建一个媒体播放器,并努力制作出现在汽车显示器主机上的简单Toast消息.
在我的自定义操作中,我有一个需要在Car界面上显示Toast消息的操作,但是当我实现toast时,它只显示在手持设备/手机上.
我已经搜索了互联网的高低,并且无法找到关于在Car Head Unit上显示toast的任何信息,即使它已在Android Auto Design指南中列出:: https://designguidelines.withgoogle.com/android-auto/ Android的自动/ APP-ui.html#应用程序的UI抽屉
有人可以请给我一个在Android自动平台上提供视觉反馈或祝酒的例子吗?
我想在单击禁用按钮时显示 Toast 消息。
button.setEnable(false);
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick (View v)
{
Toast.makeText(SliderDemo.this, "Button Disabled",Toast.LENGTH_LONG).show(); }}
Run Code Online (Sandbox Code Playgroud)
我们可以在同一个按钮上同时使用触摸监听器和点击监听器吗?
我有一个Activity除了显示如下 Toast 消息之外什么都不做。
public MyActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Toast.makeText(this, "Some message", Toast.LENGTH_LONG).show();
finish(); // Finish the activity here.
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用 Robolectric 编写一个单元测试来验证Toast内容。我尝试了以下方法。
@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {
@Before
public void setup() {
Robolectric.buildActivity(MyActivity.class).create();
}
@Test
public void testToast() {
assertTrue(ShadowToast.showedCustomToast("Some message", R.string.some_message));
assertThat(ShadowToast.getTextOfLatestToast().toString(), equalTo("Some message"));
}
}
Run Code Online (Sandbox Code Playgroud)
看起来他们都没有工作。有任何想法吗?
提前致谢!
在官方 android 文档中,提到setGravity当在文本 toast 上调用时,toast 上的方法将是无操作的 - 对于针对 Android 的应用程序Build.VERSION_CODES#R,
我自己从上面的理解是,setGravity对于具有目标 API 的应用程序,其上设置的 文本 toastBuild.VERSION_CODES#R将根本不尊重使用
setGravity方法设置的重力配置。
如果这种理解成立,是否有其他方法可以通过应用程序定位来调整文本吐司的重力Build.VERSION_CODES#R?
另外,从设计的角度来看,对文本吐司施加这种限制的可能原因是什么?
这个简单的检查适用于 sdk 29,但不适用于 sdk 30:
onView(withText(R.string.text)).inRoot( withDecorView(not(mActivityRule.activity.window.decorView))) .check(matches(isDisplayed()))
我得到 androidx.test.espresso.NoMatchingRootException。
任何人都可以帮助解决这个问题吗?
我正在 Android 11 模拟器 (Pixel 5 API 31) 上测试我的应用程序,当我打开 Toast 通知时,我会看到以下内容:

Toast 旁边有一个蓝色的默认/占位符 Android 图标。如何用我自己的图标替换这个占位符图标?
旧版本的 Android 不会显示任何带有 toast 消息的图标。
我的应用程序已经有一个自定义启动器图标、通知图标以及操作栏和选项卡图标。所以看起来它并没有继承于此,但我无法弄清楚我需要添加或更改什么来用我自己的图标替换它或删除它。
这是我的 java 代码,用于在需要时启动 toast:
Toast.makeText(getContext(),getString(R.string.crashTurnedOn),Toast.LENGTH_SHORT).show();
Run Code Online (Sandbox Code Playgroud)
感谢您的任何帮助。
该文档称,在针对Android 12 或更高版本的应用程序上,Toast 被截断为两行。我观察到的行为是,在运行 Android 12 或更高版本的设备上安装的应用程序上,Toast 被截断为两行。
具体来说,我的手机更新到 Android 12之前安装的一个应用程序的toast 不会被截断,但如果我将其安装在运行 Android 12 的模拟器上,它的 toast 就会被截断。我的手机更新到 Android 12后重建并安装的另一个应用程序的toast 被截断。
更新:
情况实际上似乎更复杂:行为还取决于设备,并且显然还取决于它是调试版本还是发布版本。被截断其 toast 的同一个应用程序可以在我的手机上使用发布版本正确显示它们,但在模拟器上使用相同的版本版本截断它们。
请注意,这与70307699不同,OP 将其更新targetSdk为 31。我的两个应用程序都targetSdk设置为小于 31。
我怎样才能获得记录的行为并恢复我的祝酒词?
android ×10
android-toast ×10
java ×3
android-11 ×2
toast ×2
unit-testing ×2
android-12 ×1
android-auto ×1
assertion ×1
button ×1
customizing ×1
layoutparams ×1
matcher ×1
robolectric ×1