为什么findViewById()方法只在活动类的方法中工作,而不直接在类中工作


public class MainActivity extends AppCompatActivity {
TextView name_header;
//this results into an error
name_header = (TextView) findViewById(R.id.name_header);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_order);
//whereas, this works perfectly
name_header = (TextView) findViewById(R.id.name_header);
...
}
}

问题是,我试图使用findViewById((全局初始化TextView对象但它在运行时抛出了一个错误,然后如果我在onCreate((或任何其他方法中使用它,初始化就可以正常工作。

我正在为API 22级及以上开发

如您所知,setContentView(R.layout.menu_order);定义了要附加到此特定java类的布局。因此,如果您从该XML初始化任何视图,它在任何地方都找不到它。因为它不知道在哪里查找idname_header。所以,它显示了你的错误。

现在,我阅读你的评论。如果我是正确的,你正在onCreate()之后初始化视图。意思是这样的。

...
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_order);
}
name_header = (TextView) findViewById(R.id.name_header);
}
...

所以,这个和这个是一样的。

...
public class MainActivity extends AppCompatActivity {
name_header = (TextView) findViewById(R.id.name_header);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.menu_order);
}
}
...

因此,它将给出一个错误。您必须在任何方法中初始化视图。因为首先java要初始化方法之外的变量。然后它会进入任何其他方法。

在调用onCreate(…(中的setContentView(…(函数之前,布局(-file(尚未膨胀/设置。因此,目前还没有什么可查找的身份证。

正如安卓文档所描述的:

公共T findViewById(int id(

查找由onCreate(Bundle(中处理的android:id XML属性标识的视图。

但由于您已经将TextView声明为"global",因此您可以在onCreate函数中初始化它,并在MainActivity中的其他任何位置使用它,而不会出现问题。

最新更新