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中的其他任何位置使用它,而不会出现问题。