我想知道是否有任何好的设计模式来初始化自定义视图(例如传入模型/渲染器)。特别是我对允许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()
的情况下调用时抛出空指针异常。
是否会有其他方法可以实现这一目标?一些想法脱颖而出:
custom:renderer="@values/default_renderer"
然后为布局预览视图tools:renderer="@values/preview_renderer"
指定一个。似乎可能not be good support for this(参见限制部分)。在实例化渲染器无法在静态/预览环境中轻松完成的某些情况下,这也可能不起作用。