自定义视图初始化的模式与布局预览兼容

时间:2015-02-28 23:42:49

标签: android android-layout android-studio

我想知道是否有任何好的设计模式来初始化自定义视图(例如传入模型/渲染器)。特别是我对允许Android Studio布局预览工作的模式(或类似mirror之类的工作)感兴趣。

例如,采用简单的游戏结构:

layout.xml

<LinearLayout>
  <com.package.GameSurface>
</LinearLayout>

GameSurface.java

public class GameSurface extends View {

    int mComputedParam;

    Renderer mRenderer;
    GameState mGameState;

    public PlaySurface(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PlaySurface(Context context) {
        super(context);
    }

    // What are other ways of achieving this?
    public void init(GameState gameState, Renderer renderer) {
        mGameState = gameState;
        mRenderer = renderer;
    }

    @Override
    protected void onSizeChanged(int newWidth, int newHeight, int oldWidth, int oldHeight) {
        // Game state is used to calculate some layout/size/render information on the fly
        mComputedParam = (newWidth - getPaddingLeft() - getPaddingRight()) / mGameState.level();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // Render can be swapped out based on level or user settings, etc
        mRenderer.draw();
    }

}

这样的事情会导致Android工作室布局预览崩溃,因为onDraw和onSizeChanged都会在没有init()的情况下调用时抛出空指针异常。

是否会有其他方法可以实现这一目标?一些想法脱颖而出:

  • 在布局预览中设置默认渲染器和模型以回退到。如果这是首选解决方案,有没有办法检测我的代码是否在布局预览中运行?
  • 可以选择通过某种XML属性选择渲染器,例如: custom:renderer="@values/default_renderer"然后为布局预览视图tools:renderer="@values/preview_renderer"指定一个。似乎可能not be good support for this(参见限制部分)。在实例化渲染器无法在静态/预览环境中轻松完成的某些情况下,这也可能不起作用。
  • 也许有一种方法可以在我忽略的布局预览中运行一些设置代码?

0 个答案:

没有答案