Android:holder.getSurface()总是返回null
问题描述:
我的视图是一堆普通的小部件和surfaceview。我不知道为什么在我得到SurfaceView的surfaceholder
并且在持有者上再次使用getSurface()
后,我总是会返回null。Android:holder.getSurface()总是返回null
这里是我的示例代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.view);
}
@Override
public void onResume() {
super.onResume();
surface = (SurfaceView) findViewById(R.id.surfaceView);
this.holder = surface.getHolder();
if (holder.getSurface().isValid()){ // get surface again
Log.i("Notice","Surface holder is valid");
}
else
Log.i("Notice","Surface holder ISNOT valid"); //Always receive this
}
当我看到Android的文档getSurface()
方法。这是怎么说的:
直接访问表面对象。 Surface可能并不总是 - 例如,在使用SurfaceView时,持有人的Surface 不会创建,直到视图已附加到窗口管理器 并执行布局以确定尺寸和屏幕 的位置表面。因此,您通常需要执行 Callback.surfaceCreated以了解Surface何时可以使用 。
我不明白这这么多,但我知道我有想念的东西。请为我解释,并告诉我有关Callback.surfaceCreated
的手段,以及如何实施它?
谢谢:)
答
您要使用的表面时,它还不可用。没关系,您的Activity.onCreate
或Activity.onResume
方法不可用,因为实际上,曲面放置在“活动”窗口后面的单独窗口中,并具有自己的生命周期。 您需要执行SurfaceHolder.Callback以接收有关Surface
可用性的事件,并从单独的线程进行绘制。看看Android SDK示例文件夹中的LunarLander项目,它显示了如何正确使用SurfaceView。
你的回调看起来类似的东西:
public class MyCallback implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format,
int width, int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// you need to start your drawing thread here
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// and here you need to stop it
}
}
而且比你需要设置这个回调SurfaceHolder:
surface.getHolder().addCallback(new MyCallback());