Android:surfaceView不能在onCreate()中使用getHolder(),必须在onResume()中

时间:2012-07-15 05:59:15

标签: java android layout surfaceview surfaceholder

在我的活动中,我有一些观点和surfaceView

这是我在onCreate()

中的第一个代码
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    upBtn = (Button) findViewById(R.id.upBtn);
    // and more widget here
    surface = (SurfaceView) findViewById(R.id.surfaceView);     
    this.holder = surface.getHolder(); // NullPointerException
    setContentView(R.layout.view);

如果我通过surfaceView中的getHolder()onResume()来更改上述代码(我已尝试多次获得此结果),则无错误:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    upBtn = (Button) findViewById(R.id.upBtn);
    // and more widget here
    // surface = (SurfaceView) findViewById(R.id.surfaceView); //cancel     
    // this.holder = surface.getHolder(); // cancel
    setContentView(R.layout.view);

public void onResume() {
    surface = (SurfaceView) findViewById(R.id.surfaceView);     
    this.holder = surface.getHolder(); // No Error now

请为我解释。

1 个答案:

答案 0 :(得分:5)

你需要打电话

setContentView(R.layout.layoutXML); 
在致电findViewById(R.id.viewID)之前

。这就是为什么你的findview由id返回nul,你可能在调用surfaceView.getHolder时得到nullPointerException

建议的解决方案是,创建一个layout.xml文件,该文件应该在任何布局中包含surfaceView。

在您的Activity的oncreate call setContentView(R.layout.layoutXML);中,然后您可以通过findViewByID检索表面视图并随意执行任何操作。