所以目前我有一个观点
<TextureView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/texture_view"
android:visibility="gone" />
仅支持Android API 14及以上...我想为API创建不同的视图&lt; 14 ...所以我想创建一个抽象视图并在XML布局文件中调用它
<CustomView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/texture_view"
android:visibility="gone" />
代码中是否可以执行以下操作
CustomView v;
if (DeviceVersion.atLeast(API_14)) {
v = (TextureView) root.findViewById(R.id.texture_view);
}
else {
v = (SurfaceView) root.findViewById(R.id.texture_view);
}
其中CustomView是Surface和Texture的一部分......或者我是否需要制作两个不同的View说CustomSurface和CustomTexture来实现CustomView?
如果有更好的方法来解决此API视图问题,请告诉我
答案 0 :(得分:2)
资源系统为您提供了一种方法:
my_render_view.xml
的布局文件SurfaceView
,并将其放入res/layout
。my_render_view.xml
的第二个布局文件TextureView
,并将其放入res/layout-v14
。SurfaceView
或TextureView
的布局文件中,您可以添加<include layout="@layout/my_render_view />
。资源系统将根据API版本加载相应的布局文件。 API版本14及更高版本的TextureView
,否则为SurfaceView
。
在您的代码中,您可能需要提供2个代码路径,类似于您在问题中的代码路径:
if (DeviceVersion.atLeast(API_14)) {
TextureView view = (TextureView) root.findViewById(R.id.texture_view);
// ... do something with TextureView ...
}
else {
SurfaceView view = (SurfaceView) root.findViewById(R.id.texture_view);
// .... do something with SurfaceView
}
或隐藏容器类中的代码路径:
abstract class RenderView {
public abstract void doSomething();
}
class DefaultRenderView {
private SurfaceView mView;
public DefaultRenderView(SurfaceView view) {
mView = view;
}
public void doSomething() {
// SurfaceView specific code
}
}
class TextureRenderView {
private TextureView mView;
public TextureRenderView(TextureView view) {
mView = view;
}
public void doSomething() {
// TextureView specific code
}
}
RenderView renderView;
if (DeviceVersion.atLeast(API_14)) {
renderView = new TextureRenderView(
(TextureView) root.findViewById(R.id.texture_view));
}
else {
renderView = new DefaultRenderView(
(SurfaceView) root.findViewById(R.id.texture_view));
}
Android开发人员文档提供了有关包含元素here
的更多信息