0

在我的活动中,我有一些观点和一个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

请为我解释。

4

1 回答 1

5

因为你需要打电话

setContentView(R.layout.layoutXML); 

在你打电话之前findViewById(R.id.viewID)。这就是为什么您的 findview by id 返回 nul,并且您在调用 surfaceView.getHolder 时可能会收到 nullPointerException

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

在您的 Activity 的 oncreate 调用中 setContentView(R.layout.layoutXML);,之后您可以通过 findViewByID 检索表面视图并使用它做任何您想做的事情。

于 2012-07-15T06:30:26.000 回答