我在Android Studio中一直收到此错误:
java.lang.RuntimeException:无法实例化活动 ComponentInfo {dit.assignment3 / dit.assignment3.Timer}: java.lang.NullPointerException:尝试调用虚方法 ' android.view.View android.view.Window.findViewById(int)'在null 对象参考
但我似乎无法在我的代码中找到错误的地方,尝试评论我所拥有的所有findViewById但没有运气。
代码:
public class Timer extends AppCompatActivity {
//declaring all items on page in class
EditText hoursIn = (EditText) findViewById(R.id.hoursET);
EditText minIn = (EditText) findViewById(R.id.minET);
Button start = (Button) findViewById(R.id.startButton);
Button stop = (Button) findViewById(R.id.stopButton);
TextView textViewTime = (TextView) findViewById(R.id.timeDisp);
/**
* ATTENTION: This was auto-generated to implement the App Indexing API.
* See https://g.co/AppIndexing/AndroidStudio for more information.
*/
// private GoogleApiClient client;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
textViewTime.setText("00:00:30");
final CounterClass timer = new CounterClass(30000, 1000);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timer.start();
}
});
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timer.cancel();
}
});
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
//client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}
//@Override
/*public void onStart() {
super.onStart();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
client.connect();
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"Timer", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app deep link URI is correct.
Uri.parse("android-app://dit.assignment3/http/host/path")
);
AppIndex.AppIndexApi.start(client, viewAction);
}
@Override
public void onStop() {
super.onStop();
// ATTENTION: This was auto-generated to implement the App Indexing API.
// See https://g.co/AppIndexing/AndroidStudio for more information.
Action viewAction = Action.newAction(
Action.TYPE_VIEW, // TODO: choose an action type.
"Timer Page", // TODO: Define a title for the content shown.
// TODO: If you have web page content that matches this app activity's content,
// make sure this auto-generated web page URL is correct.
// Otherwise, set the URL to null.
Uri.parse("http://host/path"),
// TODO: Make sure this auto-generated app deep link URI is correct.
Uri.parse("android-app://dit.assignment3/http/host/path")
);
AppIndex.AppIndexApi.end(client, viewAction);
client.disconnect();
}*/
public class CounterClass extends CountDownTimer {
/**
* @param millisInFuture The number of millis in the future from the call
* to {@link #start()} until the countdown is done and {@link #onFinish()}
* is called.
* @param countDownInterval The interval along the way to receive
* {@link #onTick(long)} callbacks.
*/
public CounterClass(long millisInFuture, long countDownInterval) {
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {
long millis = millisUntilFinished;
String hrsminsec = String.format("%02:%02:%02", TimeUnit.MILLISECONDS.toHours(millis),
TimeUnit.MILLISECONDS.toMinutes(millis) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toMinutes(millis)),
TimeUnit.MILLISECONDS.toSeconds(millis - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toSeconds(millis)))
);
textViewTime.setText(hrsminsec);
}
@Override
public void onFinish() {
textViewTime.setText("DONE");
}
}
}
干杯
答案 0 :(得分:1)
findViewById
和onCreate
之前调用{p> setContentView
。
围绕以下内容进行更改
EditText hoursIn;
public void onCreate(...){
...
setContentView(...);
hoursIn = (EditText) findViewById(R.id.hoursET);
...
}
原因是findViewById
将查找当前显示的元素,在设置内容视图之前,找不到任何内容,从而留下findViewById
的结果要 null 。
答案 1 :(得分:1)
您应该在创建窗口之前将findViewById
调用放入您尝试分配它们的onCreate
中。
EditText hoursIn;
EditText minIn;
Button start;
Button stop;
TextView textViewTime;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
hoursIn = (EditText) findViewById(R.id.hoursET);
minIn = (EditText) findViewById(R.id.minET);
start = (Button) findViewById(R.id.startButton);
stop = (Button) findViewById(R.id.stopButton);
textViewTime = (TextView) findViewById(R.id.timeDisp);
答案 2 :(得分:0)
You should assign all controls in onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
EditText hoursIn = (EditText) findViewById(R.id.hoursET);
EditText minIn = (EditText) findViewById(R.id.minET);
textViewTime.setText("00:00:30");
final CounterClass timer = new CounterClass(30000, 1000);
start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
timer.start();
}
});