Timer 屏幕上未显示计时器

Timer 屏幕上未显示计时器,timer,Timer,我不熟悉android编码,我写这段代码是为了帮助我评估自己的进度,以及对android编码的理解。定时器应在按下启动按钮后启动。根据调试,我认为程序运行正确。但屏幕上并没有定时器输出 请帮忙,谢谢 .XML文件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="htt

我不熟悉android编码,我写这段代码是为了帮助我评估自己的进度,以及对android编码的理解。定时器应在按下启动按钮后启动。根据调试,我认为程序运行正确。但屏幕上并没有定时器输出

请帮忙,谢谢 .XML文件

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.android.clockproject.MainActivity">

    <Button
        android:id="@+id/startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:text="START"
        android:onClick="collectTime"/>

    <TextView
        android:id="@+id/digits_display"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text=""
        android:textSize="50sp"
        android:layout_centerInParent="true"
         />

</RelativeLayout>

.Java文件

package com.example.android.clockproject;

import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import static android.R.attr.button;
import static android.R.attr.onClick;

public class MainActivity extends AppCompatActivity {
    int hours = 0;
    String hoursDisplay = "00";
    int minutes = 0;
    String minutesDisplay = "00";
    int seconds = 0;
    String secondsDisplay = "00";
    int milliSecond = 0;
    String millisecondDisplay = "0";
    String fullTimeDisplay;
    int loop = 7;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    /**
     * method collectTime is called when "start" button is pressed
     */

    public void collectTime(View view) {
        while (loop == 7) {
            fullTimeDisplay = hoursDisplay + ":" + minutesDisplay + ":" + secondsDisplay + "." + millisecondDisplay;
            displayMessage(fullTimeDisplay);
            firstDigit();
        }
    }

    /**
     * method is called to increse hours
     *
     * @param hours
     * @return
     */
    private String forthDigit(int hours) {
        hours = hours + 1;
        if (hours == 13) {
            hours = 0;
        }
        if (hours < 10) {
            hoursDisplay = "0" + hours;
        } else {
            hoursDisplay = "" + hours;
        }
        return hoursDisplay;
    }

    /**
     * method is called to increase minutes
     *
     * @param minutes
     * @return
     */
    private String thirdDigit(int minutes) {
        minutes = minutes + 1;
        if (minutes == 60) {
            forthDigit(hours);
            minutes = 0;
        }
        if (minutes < 10) {
            minutesDisplay = "0" + minutes;
        } else {
            minutesDisplay = "" + minutes;
        }
        return minutesDisplay;
    }

    /**
     * method called to increase seconds
     *
     * @return
     */
    private int secondDigit() {
        seconds = seconds + 1;
        if (seconds == 60) {
            thirdDigit(minutes);
            seconds = 0;
        }
        if (seconds < 10) {
            secondsDisplay = "0" + seconds;
        } else {
            secondsDisplay = "" + seconds;
        }
        return seconds;
    }

    /**
     * method called to increase milliseconds
     */
    private void firstDigit() {
        milliSecond = milliSecond + 1;
        if (milliSecond > 9) {
            milliSecond = 0;
            millisecondDisplay = "0";
            secondDigit();
        }
        millisecondDisplay = "" + milliSecond;

    }

    /**
     * This method displays the given fullTimeDisplay "the clock" on the screen.
     */
    public void displayMessage(String fullTimeDisplay) {
        TextView timeDisplayTextView = (TextView) findViewById(R.id.digits_display);
        timeDisplayTextView.setText(fullTimeDisplay);
    }
}
package com.example.android.clockproject;
导入android.os.Build;
导入android.support.annotation.RequiresApi;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.TextView;
导入静态android.R.attr.button;
导入静态android.R.attr.onClick;
公共类MainActivity扩展了AppCompatActivity{
整小时=0;
字符串hoursDisplay=“00”;
整数分钟=0;
字符串分钟数display=“00”;
整数秒=0;
字符串secondsDisplay=“00”;
int毫秒=0;
字符串毫秒显示=“0”;
字符串全时显示;
int循环=7;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/**
*方法collectTime在按下“开始”按钮时调用
*/
公共时间(查看){
while(循环==7){
fullTimeDisplay=小时显示+“:”+分钟显示+“:“+秒显示+”+毫秒显示;
显示信息(全天显示);
第一位数();
}
}
/**
*方法以增加小时数
*
*@param小时
*@返回
*/
专用字符串forthDigit(整数小时){
小时=小时+1;
如果(小时==13){
小时=0;
}
如果(小时<10){
小时显示=“0”+小时;
}否则{
hoursDisplay=“”+小时;
}
返回时间显示;
}
/**
*方法以增加分钟数
*
*@param分钟
*@返回
*/
私有字符串thirdDigit(整数分钟){
分钟=分钟+1;
如果(分钟==60){
forthDigit(小时);
分钟=0;
}
如果(分钟<10){
分钟显示=“0”+分钟;
}否则{
分钟显示=”+分钟;
}
返回分钟显示;
}
/**
*方法以增加秒数
*
*@返回
*/
私有整数第二位数(){
秒=秒+1;
如果(秒==60){
第三位数(分钟);
秒=0;
}
如果(秒<10){
秒显示=“0”+秒;
}否则{
secondsDisplay=“”+秒;
}
返回秒数;
}
/**
*方法以增加毫秒数
*/
私有void firstDigit(){
毫秒=毫秒+1;
如果(毫秒>9){
毫秒=0;
毫秒显示=“0”;
第二位数();
}
毫秒显示=”+毫秒;
}
/**
*此方法在屏幕上显示给定的全天显示“时钟”。
*/
public void displayMessage(字符串fullTimeDisplay){
TextView timeDisplayTextView=(TextView)findViewById(R.id.digits\u显示);
timeDisplayTextView.setText(全天显示);
}
}

您尚未发布xml布局文件,因此很难提供帮助。 首先,我将尝试使用测试字符串从onCreate()调用displayMessage()函数。如果这不起作用,那么问题出在您的xml布局中,您需要将其添加到问题中,这样我们就可以看到哪里出了问题

编辑:

我第一次没看到这个。 如果你使用while循环来阻止主线程直到它完成,我不明白为什么它不设置文本,但是无论如何while循环都不是一个好的解决方案,因为你将来尝试运行的其他代码将无法工作

我建议将collectTime()函数更改为:

  public void collectTime(View view) {
        // 30,000 milliseconds is 30 seconds, the 1000 is how many 
        milliseoncds to wait before calling the onTick
        CountDownTimer timer = new CountDownTimer(30000, 1000) {

        public void onTick(long millisUntilFinished) {
            timeDisplayTextView.setText("seconds remaining: " + millisUntilFinished / 1000);
        }

        public void onFinish() {
            timeDisplayTextView.setText("done!");

            // restarts the time to run 30 seconds again
            timer.start();
        }

    }.start();
}

我用.XML重新发布了displayMessage(),没有while函数,太好了。我使用了你给我的代码,它起作用了,然后我用timeDisplayTextView.setView替换为显示TimeDisplay。我添加了firstDidit()开始计算。程序运行30秒。我如何用无穷大替换30000,这样程序就不会结束?请参见编辑,或者只使用Long.MAX_值作为毫秒,它将运行大约3亿年