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 视图问题,也请告诉我

资源系统为您提供了一种方法:

  1. 创建一个仅包含 SurfaceView 的布局文件 my_render_view.xml 并将其放入 res/layout.
  2. 创建仅包含 TextureView 的第二个布局文件 my_render_view.xml 并将其放入 res/layout-v14.
  3. 在应该包含 SurfaceViewTextureView 的布局文件中你可以添加一个 <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