API级别的抽象视图

时间:2015-02-02 21:41:56

标签: java android layout abstract-class

所以目前我有一个观点

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

1 个答案:

答案 0 :(得分:2)

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

  1. 创建仅包含my_render_view.xml的布局文件SurfaceView,并将其放入res/layout
  2. 创建仅包含my_render_view.xml的第二个布局文件TextureView,并将其放入res/layout-v14
  3. 在应包含SurfaceViewTextureView的布局文件中,您可以添加<include layout="@layout/my_render_view />
  4. 资源系统将根据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

    的更多信息