我是Android新手。
我想在几秒钟之后修改我的活动的TextView(它说"嘿嘿!"起初;我希望它说"你好!"之后几秒钟),所以我有:
protected void onResume() {
super.onResume();
final TextView t = (TextView)findViewById(R.id.hello);
Runnable changeTextTask = new Runnable() {
public void run() {
t.setText("hello!");
}
};
Handler h = new Handler();
h.postDelayed(changeTextTask, 3000);
}
哪个有效。但是,当我在类的开头声明Runnable时,就像这样:
public class MainActivity extends ActionBarActivity {
final TextView t = (TextView)findViewById(R.id.hello);
Runnable changeTextTask = new Runnable() {
public void run() {
t.setText("hello!");
}
};
.
.
.
protected void onResume() {
super.onResume();
Handler h = new Handler();
h.postDelayed(changeTextTask, 3000);
}
应用程序在启动时崩溃。任何人都可以解释为什么会发生这种情况/我做错了什么?
答案 0 :(得分:0)
我做错了什么?
首先,use LogCat检查崩溃的Java堆栈跟踪。
其次,不要在Activity
上调用继承的方法,例如findViewById()
,直到onCreate()
内部,通常在super.onCreate()
调用之后。在onResume()
完成后调用onCreate()
,这就是为什么您的第一版能够更好地存活下来。
第三,特别是findViewById()
,你需要在小部件已经存在之后调用它。在setContentView()
或设置用户界面的等效方法之前不会发生这种情况。
答案 1 :(得分:0)
混合Sotirios Delimanolis'和CommonsWare的回复:
LogCat显示findViewByID()导致NullPointerException,因为它在活动开始后在onCreate()(加载了TextView的资源)之前被调用。