You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android原生实现中能否用findViewById(R.layout.my_layout)?如何获取JNI返回视图?

嘿,我来帮你把这两个问题理清楚:

1. 能不能用findViewById(R.layout.my_layout)查找View?

绝对不可以!这里有个关键概念要搞懂:

  • findViewById()的参数必须是单个View的资源ID——也就是你在布局XML里给某个View设置android:id="@+id/xxx"后生成的R.id.xxx,它是用来定位布局里具体View的标识。
  • 而R.layout.my_layout是整个布局文件的资源ID,它的作用是用来加载整个布局(比如通过setContentView(R.layout.my_layout)或者LayoutInflater加载),根本不是某个View的专属标识。
  • 如果你硬把R.layout.my_layout传给findViewById(),系统会找不到对应ID的View,直接返回null。

2. 如何获取JNI调用创建的原生视图引用?

结合你给出的代码来看,你的原生方法createNativeView()已经直接创建并返回了TextView实例,接下来只要正确处理返回的对象就行:

首先,检查你的TestNativeInterface接口定义,确保createNativeView()的返回值类型和原生实现一致——原生代码返回的是TextView,接口里也应该定义为返回TextView,而不是PeerComponent(如果是代码笔误的话)。如果是因为跨平台框架限制,拿到的是PeerComponent这类封装对象,通常这类类会提供获取原生View的方法,比如getView():

// 正确接收原生返回的TextView
TestNativeInterface n = (TestNativeInterface)NativeLookup.create(TestNativeInterface.class);
android.widget.TextView nativeTextView = n.createNativeView();

// 如果确实拿到的是PeerComponent,尝试转换(示例)
// PeerComponent peerView = n.createNativeView();
// android.widget.TextView nativeTextView = (android.widget.TextView) peerView.getView();

拿到这个原生TextView的引用后,你就可以像操作普通Android View一样,把它添加到布局里或者修改属性:

// 假设你有一个预先定义好的父布局
LinearLayout parentLayout = findViewById(R.id.parent_layout);
parentLayout.addView(nativeTextView);

内容的提问来源于stack exchange,提问作者WoodenShoes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:58