Toast 通知未在某些手机中显示
Toast Notification not being displayed in certain phones
我正在开发一个应用程序,其中包括显示各种信息的 toast 通知。在测试此 phone: Nokia 6.1 (Android 8) 时,我发现没有显示祝酒词。
我按照 Android 官方开发人员指南中所述的正常方式使用 toast 通知。
我仔细检查了我的应用程序是否具有通知权限。
然后为了测试phone端有没有异常,我决定看看Gmail中"Message sent"的通知在这个手机上是如何实现的。通常,它显示为吐司,但在这个 phone 上,它显示为小吃店。
我猜这是 Android 的自定义实现。假设它是自定义实现,如何在我的应用程序中适应任何此类异常?我应该切换到 snackbar 还是有其他方法可以解决这个问题?
我个人喜欢 toast 来显示信息,切换到 snackbar 会导致应用程序发生很多潜在变化。在支持大多数 Android phone 的同时,我能做些什么来最大程度地减少影响?
我正在使用以下方法显示吐司:
public static void showLongToast(Context context, String message) {
Toast t = Toast.makeText(context, message, Toast.LENGTH_LONG);
t.show();
}
我调试了 t.show() 并且指针进入了 Toast.java 中的这段代码。
public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}
INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
TN tn = mTN;
tn.mNextView = mNextView;
try {
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
}
指针进入 throw new RuntimeException("setView must have been called");
。另外,try 块没有被执行。
我认为诺基亚实现 Toast 的方式可能存在问题。
在 AOSP 中,这就是 makeText()
所做的(public 方法只是使用空 Looper 调用此方法):
public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
@NonNull CharSequence text, @Duration int duration) {
Toast result = new Toast(context, looper);
LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);
result.mNextView = v;
result.mDuration = duration;
return result;
}
注意它如何将 mNextView
设置为内部视图。
我的理论是诺基亚以某种方式破坏了这个方法(也许他们删除了那个布局或者他们根本没有设置视图)。我正在下载 Nokia 6.1 库存 ROM,看看是否可以找到,如果找到任何内容,我会更新它。
与此同时,这里有一个可能的解决方法:
public static void showLongToast(Context context, String message) {
Toast t = Toast.makeText(context, message, Toast.LENGTH_LONG);
if (t.getView() == null) {
int layoutRes = context.getResources().getIdentifier("transient_notification", "layout", "android");
int tvRes = context.getResources().getIdentifier("message", "id", "android");
View layout = LayoutInflater.from(context).inflate(layoutRes, null);
TextView textView = layout.findViewById(tvRes);
textView.setText(message);
t.setView(layout);
}
t.show();
}
我正在开发一个应用程序,其中包括显示各种信息的 toast 通知。在测试此 phone: Nokia 6.1 (Android 8) 时,我发现没有显示祝酒词。
我按照 Android 官方开发人员指南中所述的正常方式使用 toast 通知。
我仔细检查了我的应用程序是否具有通知权限。
然后为了测试phone端有没有异常,我决定看看Gmail中"Message sent"的通知在这个手机上是如何实现的。通常,它显示为吐司,但在这个 phone 上,它显示为小吃店。
我猜这是 Android 的自定义实现。假设它是自定义实现,如何在我的应用程序中适应任何此类异常?我应该切换到 snackbar 还是有其他方法可以解决这个问题?
我个人喜欢 toast 来显示信息,切换到 snackbar 会导致应用程序发生很多潜在变化。在支持大多数 Android phone 的同时,我能做些什么来最大程度地减少影响?
我正在使用以下方法显示吐司:
public static void showLongToast(Context context, String message) {
Toast t = Toast.makeText(context, message, Toast.LENGTH_LONG);
t.show();
}
我调试了 t.show() 并且指针进入了 Toast.java 中的这段代码。
public void show() {
if (mNextView == null) {
throw new RuntimeException("setView must have been called");
}
INotificationManager service = getService();
String pkg = mContext.getOpPackageName();
TN tn = mTN;
tn.mNextView = mNextView;
try {
service.enqueueToast(pkg, tn, mDuration);
} catch (RemoteException e) {
// Empty
}
}
指针进入 throw new RuntimeException("setView must have been called");
。另外,try 块没有被执行。
我认为诺基亚实现 Toast 的方式可能存在问题。
在 AOSP 中,这就是 makeText()
所做的(public 方法只是使用空 Looper 调用此方法):
public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
@NonNull CharSequence text, @Duration int duration) {
Toast result = new Toast(context, looper);
LayoutInflater inflate = (LayoutInflater)
context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflate.inflate(com.android.internal.R.layout.transient_notification, null);
TextView tv = (TextView)v.findViewById(com.android.internal.R.id.message);
tv.setText(text);
result.mNextView = v;
result.mDuration = duration;
return result;
}
注意它如何将 mNextView
设置为内部视图。
我的理论是诺基亚以某种方式破坏了这个方法(也许他们删除了那个布局或者他们根本没有设置视图)。我正在下载 Nokia 6.1 库存 ROM,看看是否可以找到,如果找到任何内容,我会更新它。
与此同时,这里有一个可能的解决方法:
public static void showLongToast(Context context, String message) {
Toast t = Toast.makeText(context, message, Toast.LENGTH_LONG);
if (t.getView() == null) {
int layoutRes = context.getResources().getIdentifier("transient_notification", "layout", "android");
int tvRes = context.getResources().getIdentifier("message", "id", "android");
View layout = LayoutInflater.from(context).inflate(layoutRes, null);
TextView textView = layout.findViewById(tvRes);
textView.setText(message);
t.setView(layout);
}
t.show();
}