簡體   English   中英

為什么 Toast 與 Android 28+ 不兼容?

[英]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://developer.android.com/about/versions/11/reference/compat-framework-changes#change_text_toasts_in_the_system

什么是系統界面?

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)

https://itnext.io/android-11-toast-updates-7f1cd2245bc4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM