Android 每一页都有计时器
我希望计时器显示在我的所有活动中。所以我在MainActivity中编写了一个倒计时方法,并尝试从其他类调用它们。这是行不通的。它在MainActivity中工作正常,但从另一个类调用时崩溃。看起来我没有正确调用该方法Android 每一页都有计时器,android,countdowntimer,Android,Countdowntimer,我希望计时器显示在我的所有活动中。所以我在MainActivity中编写了一个倒计时方法,并尝试从其他类调用它们。这是行不通的。它在MainActivity中工作正常,但从另一个类调用时崩溃。看起来我没有正确调用该方法 MainActivity : // Timer starts and works fine in this page import android.app.Activity; import android.content.Intent; import android.os.Bu
MainActivity : // Timer starts and works fine in this page
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity implements View.OnClickListener {
TextView text;
Button button,button1;
CountDownTimer counterTimer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
text= (TextView)findViewById(R.id.timerText);
button = (Button)findViewById(R.id.startbutton);
button1 = (Button)findViewById(R.id.newPagebutton);
button.setOnClickListener(this);
button1.setOnClickListener(this);
return true;
}
public void SetTimer(){
counterTimer = new CountDownTimer(60000,1000) {
@Override
public void onTick(long millisUntilFinished) {
text.setText(" "+String.format(" %d min %d sec", TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));
}
@Override
public void onFinish() {
text.setText(" done !!!");
}
};
counterTimer.start();
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.startbutton :
SetTimer();
counterTimer.start();
break;
case R.id.newPagebutton :
Intent in = new Intent(this,NewPage.class);
startActivity(in);
break;
default:
break;
}
}
}
新建页面://尝试启动此页面中的计时器时崩溃
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class NewPage extends Activity implements View.OnClickListener {
Button button3;
TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_page);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_new_page, menu);
Intent in = getIntent();
text = (TextView) findViewById(R.id.timer2Text);
button3 = (Button) findViewById(R.id.start2button);
button3.setOnClickListener(this);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
text = (TextView) findViewById(R.id.timer2Text);
MainActivity mainActivity = new MainActivity();
mainActivity.SetTimer();
mainActivity.counterTimer.start();
}
日志:
09-10 14:23:46.270 26657-26657/com.example.timer1
E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.example.timer1, PID: 26657
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.timer1.MainActivity$1.onTick(MainActivity.java:44)
at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:133)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5257)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
看起来是TextView抛出了空指针: 上的“void android.widget.TextView.setText(java.lang.CharSequence)” 空对象引用 调用
setText()
的唯一位置是此方法:
public void SetTimer(){
counterTimer = new CountDownTimer(60000,1000) {
@Override
public void onTick(long millisUntilFinished) {
text.setText(" "+String.format(" %d min %d sec", TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished),
TimeUnit.MILLISECONDS.toSeconds(millisUntilFinished)- TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(millisUntilFinished))));
}
@Override
public void onFinish() {
text.setText(" done !!!");
}
};
counterTimer.start();
}
所以TextView文本
可能是原因,您应该在onCreate()
中设置它,而不是在oncreateoptions菜单中设置它,即使它应该在onCreate之后被调用您应该在onCreate方法中填充“text”TextView,但这不是(唯一)问题,问题是,您必须将文本TextView定义为在MainActivity上受保护,而不是在子类中重新定义它,否则您将覆盖定义具有相同名称的新文本的基本对象
只要改变一下:
TextView text -> protected TextView
在主要活动中。同时删除其他子活动中的每个“文本视图文本”定义。你应该让这句话:
text = (TextView) findViewById(R.id.timer2Text);
在儿童中,因为id可能不同(如您所示)。如果id保持不变,您也可以删除这一行。&@Flink:我按照您所说的做了,在onCreate中定义了文本视图,并在所有其他位置删除了它,还创建了受保护的文本视图,并将newpage Textview的id更改为与Mainactivity one相同,但仍然存在同样的问题,它适用于主页,但当我在新页面中尝试时,它会显示:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.widget.TextView.setText(java.lang.CharSequence)”