Android 每一页都有计时器

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中编写了一个倒计时方法,并尝试从其他类调用它们。这是行不通的。它在MainActivity中工作正常,但从另一个类调用时崩溃。看起来我没有正确调用该方法

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)”