当前位置:  开发笔记 > Android > 正文

Android - 获取计时器小部件的时间

如何解决《Android-获取计时器小部件的时间》经验,为你挑选了2个好方法。

如何从计时器中获取时间?我试过getText,getFormat,getBase等,但没有一个可以工作.

示例代码段:

Chronometer t = (Chronometer)findViewById(R.id.toptime);
long time = SystemClock.elapsedRealtime()-t.getBase();
Log.d(null,"Was: "+time); //time is not the proper time for some reason - it is a random number between 0 and 50
t.setBase(SystemClock.elapsedRealtime());
t.start();

nyenyec.. 100

如果你看一下Chronometer类的来源,你会发现它不会在一个字段中存储经过的时间,并且每次需要更新显示时都会在内部计算它.

但是,在您自己的代码中执行相同操作相对容易:

long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();

这假设你已经开始了这样的事情:

chronometerInstance.setBase(SystemClock.elapsedRealtime());
chronometerInstance.start();

这是一个完整的例子:

public class ChronoExample extends Activity {
Chronometer mChronometer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    mChronometer = new Chronometer(this);
    layout.addView(mChronometer);

    Button startButton = new Button(this);
    startButton.setText("Start");
    startButton.setOnClickListener(mStartListener);
    layout.addView(startButton);

    Button stopButton = new Button(this);
    stopButton.setText("Stop");
    stopButton.setOnClickListener(mStopListener);
    layout.addView(stopButton);

    Button resetButton = new Button(this);
    resetButton.setText("Reset");
    resetButton.setOnClickListener(mResetListener);
    layout.addView(resetButton);        

    setContentView(layout);
}

private void showElapsedTime() {
    long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();            
    Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
            Toast.LENGTH_SHORT).show();
}

View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.start();
        showElapsedTime();
    }
};

View.OnClickListener mStopListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.stop();
        showElapsedTime();
    }
};

View.OnClickListener mResetListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.setBase(SystemClock.elapsedRealtime());
        showElapsedTime();
    }
};
}

关于天文台表的一个令人困惑的事情是你无法真正将它用作秒表,它可以再次启动,停止和重启.当它运行时,它将始终显示自您上次重置它以来经过的时间,无论多少次以及您在此期间停止了多长时间.当它停止时,它只是停止更新显示.

如果您需要类似秒表的东西,您必须使用Chronometer子类或使用源创建您自己的版本.

替代文字



1> nyenyec..:

如果你看一下Chronometer类的来源,你会发现它不会在一个字段中存储经过的时间,并且每次需要更新显示时都会在内部计算它.

但是,在您自己的代码中执行相同操作相对容易:

long elapsedMillis = SystemClock.elapsedRealtime() - chronometerInstance.getBase();

这假设你已经开始了这样的事情:

chronometerInstance.setBase(SystemClock.elapsedRealtime());
chronometerInstance.start();

这是一个完整的例子:

public class ChronoExample extends Activity {
Chronometer mChronometer;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    LinearLayout layout = new LinearLayout(this);
    layout.setOrientation(LinearLayout.VERTICAL);

    mChronometer = new Chronometer(this);
    layout.addView(mChronometer);

    Button startButton = new Button(this);
    startButton.setText("Start");
    startButton.setOnClickListener(mStartListener);
    layout.addView(startButton);

    Button stopButton = new Button(this);
    stopButton.setText("Stop");
    stopButton.setOnClickListener(mStopListener);
    layout.addView(stopButton);

    Button resetButton = new Button(this);
    resetButton.setText("Reset");
    resetButton.setOnClickListener(mResetListener);
    layout.addView(resetButton);        

    setContentView(layout);
}

private void showElapsedTime() {
    long elapsedMillis = SystemClock.elapsedRealtime() - mChronometer.getBase();            
    Toast.makeText(ChronoExample.this, "Elapsed milliseconds: " + elapsedMillis, 
            Toast.LENGTH_SHORT).show();
}

View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.start();
        showElapsedTime();
    }
};

View.OnClickListener mStopListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.stop();
        showElapsedTime();
    }
};

View.OnClickListener mResetListener = new OnClickListener() {
    public void onClick(View v) {
        mChronometer.setBase(SystemClock.elapsedRealtime());
        showElapsedTime();
    }
};
}

关于天文台表的一个令人困惑的事情是你无法真正将它用作秒表,它可以再次启动,停止和重启.当它运行时,它将始终显示自您上次重置它以来经过的时间,无论多少次以及您在此期间停止了多长时间.当它停止时,它只是停止更新显示.

如果您需要类似秒表的东西,您必须使用Chronometer子类或使用源创建您自己的版本.

替代文字



2> 小智..:

我发现这个例子非常有用,感谢nyenyec!

这是关于如何将其变成真正的秒表功能的两分钱,没有子类计时器.只需更改mStartListener方法来解析mChronometer中的文本(它毕竟是从TextView派生的),计算毫秒数,并使用setBase()将基准时间重新调整为过去的那段时间:

  View.OnClickListener mStartListener = new OnClickListener() {
    public void onClick(View v) {

      int stoppedMilliseconds = 0;

      String chronoText = mChronometer.getText().toString();
      String array[] = chronoText.split(":");
      if (array.length == 2) {
        stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 1000
            + Integer.parseInt(array[1]) * 1000;
      } else if (array.length == 3) {
        stoppedMilliseconds = Integer.parseInt(array[0]) * 60 * 60 * 1000 
            + Integer.parseInt(array[1]) * 60 * 1000
            + Integer.parseInt(array[2]) * 1000;
      }

      mChronometer.setBase(SystemClock.elapsedRealtime() - stoppedMilliseconds);
      mChronometer.start();
    }
  };

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有