NativeScript调用自定义Java类报错:Cannot read property 'MyToast' of undefined
解决NativeScript中调用自定义Java类时"Cannot read property 'MyToast' of undefined"的错误
嘿,我来帮你搞定这个问题!你碰到的Cannot read property 'MyToast' of undefined错误,大概率是因为NativeScript没有正确识别到你写的Java类,或者路径、编译环节出了小问题,咱们一步步来修复:
1. 修正Java类的存放路径(最常见的坑!)
你现在把MyToast.java放在了platforms->src->java->org->example路径下,但platforms目录是NativeScript构建时自动生成的,每次构建可能会被覆盖,而且NativeScript默认不会从这个路径加载自定义原生代码。
正确的路径应该是**App_Resources/Android/src/org/example/MyToast.java**,把你的Java文件移到这个位置(如果目录不存在就手动创建)。
2. 补全Java类的代码
你的MyToast.java里Toast.makeText的第三个参数没写完,这会导致Java编译失败,自然生成不了可用的类。补全后的代码应该是这样:
package org.example; import android.widget.Toast; import android.content.Context; public class MyToast { public static void showToast(Context context, String text, String strDuration) { // 根据传入的字符串判断Toast显示时长 int duration = Toast.LENGTH_SHORT; if ("long".equalsIgnoreCase(strDuration)) { duration = Toast.LENGTH_LONG; } Toast.makeText(context, text, duration).show(); } }
3. 清理并重新构建项目
因为修改了原生代码,需要清理旧的构建缓存并重新编译,在终端运行:
tns run android --clean
这个命令会清理之前的构建文件,重新生成包含你自定义Java类的Android包。
4. 确认TypeScript中的声明和调用没问题
你的app.component.ts代码里的declare var org:any;位置是对的(在@Component之前),不过可以再检查下调用逻辑:
import {Component} from "@angular/core"; let application = require("application"); // 确保这个声明在全局作用域,不要放在@Component或类内部 declare var org: any; @Component({ selector: "my-app", templateUrl: "app.component.html", }) export class AppComponent { public onTap() { // 调用时注意参数类型匹配,第三个参数传"short"或"long" org.example.MyToast.showToast(application.android.context, "You pressed the button", "short"); } }
做完这些步骤后,重新运行应用,应该就能正常调用自定义的Toast方法啦!
内容的提问来源于stack exchange,提问作者Stephen
相关产品推荐
相关产品推荐

