API 级的抽象视图
Abstract Views for API level
所以目前我有一个观点
<TextureView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/texture_view"
android:visibility="gone" />
仅支持 Android API 14 岁及以上...我想为 API < 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 的一部分...或者我是否需要制作两个不同的视图,例如实现 CustomView 的 CustomSurface 和 CustomTexture?
如果有更好的方法解决这个 API 视图问题,也请告诉我
资源系统为您提供了一种方法:
- 创建一个仅包含
SurfaceView
的布局文件 my_render_view.xml
并将其放入 res/layout
.
- 创建仅包含
TextureView
的第二个布局文件 my_render_view.xml
并将其放入 res/layout-v14
.
- 在应该包含
SurfaceView
或 TextureView
的布局文件中你可以添加一个 <include layout="@layout/my_render_view />
.
资源系统会根据API版本加载相应的布局文件。 TextureView
对于 API 版本 14 和更新版本,否则 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
}
或者在容器中隐藏代码路径class:
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 开发者文档提供了一些关于 include 元素的更多信息 here
所以目前我有一个观点
<TextureView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/texture_view"
android:visibility="gone" />
仅支持 Android API 14 岁及以上...我想为 API < 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 的一部分...或者我是否需要制作两个不同的视图,例如实现 CustomView 的 CustomSurface 和 CustomTexture?
如果有更好的方法解决这个 API 视图问题,也请告诉我
资源系统为您提供了一种方法:
- 创建一个仅包含
SurfaceView
的布局文件my_render_view.xml
并将其放入res/layout
. - 创建仅包含
TextureView
的第二个布局文件my_render_view.xml
并将其放入res/layout-v14
. - 在应该包含
SurfaceView
或TextureView
的布局文件中你可以添加一个<include layout="@layout/my_render_view />
.
资源系统会根据API版本加载相应的布局文件。 TextureView
对于 API 版本 14 和更新版本,否则 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
}
或者在容器中隐藏代码路径class:
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 开发者文档提供了一些关于 include 元素的更多信息 here