在Android操作栏中创建倒数计时器

时间:2015-06-29 16:25:10

标签: java android timer android-actionbar

我无法创建从操作栏查看的倒数计时器。现在这是我的menu_main.xml和MainActivity.java代码的一部分:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    undoValuesA.add(scoreTeamA);
    undoValuesB.add(scoreTeamB);
    if (savedInstanceState != null) {
        scoreTeamA = savedInstanceState.getInt(SCORE_TEAM_A_KEY);
        scoreTeamB = savedInstanceState.getInt(SCORE_TEAM_B_KEY);
        undoValuesA = savedInstanceState.getIntegerArrayList(UNDO_A_KEY);
        undoValuesB = savedInstanceState.getIntegerArrayList(UNDO_B_KEY);
    }
    displayForTeamA(scoreTeamA);
    displayForTeamB(scoreTeamB);

    swish = MediaPlayer.create(this, R.raw.swish);

    textViewTime = (TextView) findViewById(R.id.timer);
    textViewTime.setText("3:00");



}



<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item
    android:title = "0:00"
    android:id = "@+id/timer"
    app:showAsAction = "always"

    />
<item android:id="@+id/action_plus"
    android:title="Plus"
    android:icon="@drawable/ic_action_plus"
    android:orderInCategory="100"
    app:showAsAction="always"/>

<item android:id="@+id/action_minus"
    android:title="minus"
    android:icon="@drawable/ic_action_minus"
    android:orderInCategory="100"
    app:showAsAction="always"/>

我的应用程序崩溃了,因为操作栏中的计时器不是文本视图,而只是一个项目。所以,当我尝试使用textViewTime.setText(“3:00”);它在开始时崩溃了。 我该如何实现呢?

1 个答案:

答案 0 :(得分:2)

步骤1:实施&#34;倒计时器&#34;作为自定义View类,例如此ReverseChronometer实现:

/***
  Copyright (c) 2013 CommonsWare, LLC
  Licensed under the Apache License, Version 2.0 (the "License"); you may not
  use this file except in compliance with the License. You may obtain a copy
  of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required
  by applicable law or agreed to in writing, software distributed under the
  License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
  OF ANY KIND, either express or implied. See the License for the specific
  language governing permissions and limitations under the License.

  From _The Busy Coder's Guide to Android Development_
    http://commonsware.com/Android
 */

package com.commonsware.android.preso.slides;

import android.content.Context;
import android.graphics.Color;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.widget.TextView;

public class ReverseChronometer extends TextView implements Runnable {
  long startTime=0L;
  long overallDuration=0L;
  long warningDuration=0L;
  boolean isRunning=false;

  public ReverseChronometer(Context context) {
    super(context);

    reset();
  }

  public ReverseChronometer(Context context, AttributeSet attrs) {
    super(context, attrs);

    reset();
  }

  @Override
  public void run() {
    isRunning=true;

    long elapsedSeconds=
        (SystemClock.elapsedRealtime() - startTime) / 1000;

    if (elapsedSeconds < overallDuration) {
      long remainingSeconds=overallDuration - elapsedSeconds;
      long minutes=remainingSeconds / 60;
      long seconds=remainingSeconds - (60 * minutes);

      setText(String.format("%d:%02d", minutes, seconds));

      if (warningDuration > 0 && remainingSeconds < warningDuration) {
        setTextColor(0xFFFF6600); // orange
      }
      else {
        setTextColor(Color.WHITE);
      }

      postDelayed(this, 1000);
    }
    else {
      setText("0:00");
      setTextColor(Color.RED);
      isRunning=false;
    }
  }

  public void reset() {
    startTime=SystemClock.elapsedRealtime();
    setText("--:--");
    setTextColor(Color.WHITE);
  }

  public void stop() {
    removeCallbacks(this);
    isRunning=false;
  }

  public boolean isRunning() {
    return(isRunning);
  }

  public void setOverallDuration(long overallDuration) {
    this.overallDuration=overallDuration;
  }

  public void setWarningDuration(long warningDuration) {
    this.warningDuration=warningDuration;
  }
}

步骤2:使用android:actionViewClass(或者,在您的情况下,app:actionViewClass)指向菜单资源中步骤#1的类,例如本机操作栏中的类:< / p>

<item
    android:id="@+id/countdown"
    android:actionViewClass="com.commonsware.android.preso.slides.ReverseChronometer"
    android:showAsAction="always"
    android:title="This Should Not Be Needed">
</item>

步骤3:检索该操作项并从Java代码中对其进行配置,例如对于本机操作栏:

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_actions, menu);

    ReverseChronometer rc=(ReverseChronometer)menu
                                                .findItem(R.id.countdown)
                                                .getActionView();

    rc.setOverallDuration(40*60);
    rc.setWarningDuration(5*60);
    rc.setOnClickListener(this);
    rc.setOnLongClickListener(this);
    rc.setTextSize(TypedValue.COMPLEX_UNIT_SP, 24);
    rc.setTextColor(Color.WHITE);

    return(super.onCreateOptionsMenu(menu));
  }

当您使用appcompat-v7操作栏后退时,您需要对步骤2和步骤3进行适当的调整。