[英]Why Toast is not compatible with Android 28+?
為什么標准形式的 Toast(也在當前的谷歌 android 在線文檔中)在 Android compileSdkVersion/targetSdkVersion 28 中為應用程序提供“錯誤調用者”錯誤。使用 getApplicationContext() 無關緊要。
public class MainActivity extends Activity implements SensorEventListener {
...
OnClickListener captureListener = new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "pop-up text", Toast.LENGTH_LONG).show();
}
};
}
錯誤行,在真正的 android-11 設備上:
V/Toast: Toast SHOW: android.widget.Toast@86d08e5 view = android.widget.LinearLayout{540bfba VE..... ......I. 0,0-0,0} pkg: com.example.app TextToast? false caller: com.example.app.MainActivity$1.onClick:211...
build.gradle 依賴:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'commons-io:commons-io:2.4'
implementation "androidx.appcompat:appcompat:1.3.1"
implementation "androidx.appcompat:appcompat-resources:1.3.1"
}
從 Android 11+ 開始對Toast.makeText()
代碼進行了更改,並引入了兼容性CHANGE_TEXT_TOASTS_IN_THE_SYSTEM檢查。
/**
* Make a standard toast to display using the specified looper.
* If looper is null, Looper.myLooper() is used.
*
* @hide
*/
public static Toast makeText(@NonNull Context context, @Nullable Looper looper,
@NonNull CharSequence text, @Duration int duration) {
if (Compatibility.isChangeEnabled(CHANGE_TEXT_TOASTS_IN_THE_SYSTEM)) {
Toast result = new Toast(context, looper);
result.mText = text;
result.mDuration = duration;
return result;
} else {
Toast result = new Toast(context, looper);
View v = ToastPresenter.getTextToastView(context, text);
result.mNextView = v;
result.mDuration = duration;
return result;
}
}
CHANGE_TEXT_TOASTS_IN_THE_SYSTEM 更改 ID:147798919
默認 state:為面向 Android 11(API 級別 30)或更高版本的應用啟用。
文本 toast 現在由 SystemUI 而非應用內呈現。 這可以防止應用繞過在后台發布自定義 toast 的限制。
什么是系統界面?
https://android.googlesource.com/platform/frameworks/base/+/master/packages/SystemUI/README.md
正如 Myrick Chow 所解釋的,您現在必須實例化一個 Toast(第一種方法),而不是使用 static Toast object(第二種方法),如下所示。
// Method 1: Public constructor
val simpleToast = Toast(this)
// Method 2: Static constructor
val textToast = Toast.makeText(this, "Simple toast message", Toast.LENGTH_SHORT)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.