【问题标题】:android dialog with clock timer带有时钟计时器的android对话框
【发布时间】:2014-03-04 03:48:31
【问题描述】:

我想制作一个显示计时器的对话框。每隔一秒定时器值就会增加。用户可以随时单击确定并关闭对话框。

对话框本身不是问题。但是如何创建每秒钟执行给定程序的计时器呢?而且,在用户关闭对话框后它会“不会爆炸(=不会引起问题)”(然后对话框对象将不存在,因此处理程序应该能够检测到这种情况,而不是显示新的计时器值,它应该停止计时器。

提前感谢您的帮助。

【问题讨论】:

  • 查看这篇文章:stackoverflow.com/questions/4597690/android-timer-how。应该会有帮助。
  • 谢谢。这是有用的链接,但在这里我们没有相同的场景。正如您给我的链接一样,计时器想要取消对话框,在我的情况下,用户可以取消对话框。那么 timer 方法会发生什么?
  • 我不知道如何编写在关闭对话框后“关闭”处理程序的代码......

标签: android timer android-handler


【解决方案1】:

我编写了一个示例,但我不确定它是否是您正在寻找的:

public class TimerDialog extends DialogFragment {

    private static final String TIME = "sec";

    private TextView mTime;
    private TimerTask mTimerTask;
    private long mSec;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
        alert.setTitle("Timer");
        alert.setPositiveButton("OK", null);

        View view = View.inflate(getActivity(), R.layout.timer_dialog, null);
        mTime = (TextView) view.findViewById(R.id.time);

        alert.setView(view);
        return alert.create();
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (savedInstanceState != null) {
            mSec = savedInstanceState.getLong(TIME);
            mTime.setText(String.valueOf(mSec));
        }
        startTimer();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        stopTimer();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putLong(TIME, mSec);
    }

    private void startTimer() {
        Timer t = new Timer();

        mTimerTask = new TimerTask() {
            @Override
            public void run() {
                mSec++;
                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mTime.setText(String.valueOf(mSec));
                    }
                });
            }
        };

        t.scheduleAtFixedRate(mTimerTask, 1000, 1000);
    }

    private void stopTimer() {
        mTimerTask.cancel();
    }
}

和 timer_dialog:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/time"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:text="0"
    android:gravity="center" />

【讨论】:

  • 很好的答案。我将在 1,2 天后返回以检查它在实施时是如何工作的。但看来你解决了我所有的问题。非常感谢!
  • 接受 ;) 再次感谢您的帮助。你花了很多时间来准备,所以再次感谢你。
  • 不...我花了几分钟。享受吧!
猜你喜欢
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多