首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android dispatchTouchEvent 中 Toast 崩潰:Resources$NotFoundException 真相

     編輯:程式設計疑難解答

錯誤堆疊回顧

android.content.res.Resources$NotFoundException: String resource ID #0x1
    at android.widget.Toast.makeText(Toast.java:268)
    at com.example.baby.widget.AutoScrollViewPager.dispatchTouchEvent(...)

核心原因:重載方法簽名誤用

Toast.makeText(Context, int, int) 的第二個參數被標註為 @StringRes int resId,意圖是傳入字串資源 ID(如 R.string.xxx),而非任意整數。

代碼中:getCurrentItem() 回傳 int(頁面索引 0, 1, 2...),編譯器匹配到此重載,以為你傳的是資源 ID。運行時系統嘗試根據此 ID 查找字串資源,找不到(如 0x1 對應無資源),拋出 Resources$NotFoundException。

修正方法:強制使用 CharSequence 重載

將整數轉為字串,讓編譯器選擇 makeText(Context, CharSequence, int):

// 錯誤
Toast.makeText(context, getCurrentItem(), 0).show();

// 正確:任選其一
Toast.makeText(context, getCurrentItem() + "", 0).show();        // 拼接空串
Toast.makeText(context, String.valueOf(getCurrentItem()), 0).show(); // 明確轉換
Toast.makeText(context, Integer.toString(getCurrentItem()), 0).show(); // 標準轉換

為什麼在 dispatchTouchEvent 中彈 Toast 仍不建議?

  • 觸發頻率極高:觸摸事件流(DOWN/MOVE/UP)會在幾十毫秒內連續觸發,彈出大量 Toast 疊加,導致 UI 卡頓、ANR。
  • 生命週期風險:View 未附著到 Window 時呼叫 Toast 可能崩潰。
  • 調試替代方案:使用 Log.d("TAG", "item=" + getCurrentItem()) 輸出到 Logcat,不阻塞主執行緒,資訊完整可過濾。

總結

  1. 崩潰根因:int 被誤判為 @StringRes 資源 ID。
  2. 快速修復:getCurrentItem() + "" 轉為字串。
  3. 工程建議:觸摸事件流中嚴禁彈 Toast,改用 Log 除錯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved