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
相关产品推荐
相关产品推荐

