Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义文本视图触发RuntimeException“;错误充气“;_Java_Android_Multithreading_View - Fatal编程技术网

Java 自定义文本视图触发RuntimeException“;错误充气“;

Java 自定义文本视图触发RuntimeException“;错误充气“;,java,android,multithreading,view,Java,Android,Multithreading,View,我想扩展TextView以实现秒表功能。我遇到的问题是关于充气过程的运行时异常 03-30 12:57:28.749: E/AndroidRuntime(5700): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.lipsksoft.apps.anwendung.t6student/de.lipsksoft.apps.anwendung.t6student.opsActivity}: android.v

我想扩展TextView以实现秒表功能。我遇到的问题是关于充气过程的运行时异常

03-30 12:57:28.749: E/AndroidRuntime(5700): java.lang.RuntimeException: Unable to start activity ComponentInfo{de.lipsksoft.apps.anwendung.t6student/de.lipsksoft.apps.anwendung.t6student.opsActivity}:
android.view.InflateException: Binary XML file line #29: Error inflating class de.lipsksoft.apps.anwendung.t6student.TimerView.t6student.TimerView
由于这里的提示,我做了一些更改。 我的新代码:

public class Timer extends TextView{

    private Handler handler = new Handler();
    private long startTime;
    private long elapsedTime;
    private final int REFRESH_RATE = 100;
    private String hours,minutes,seconds,milliseconds;
    private long secs,mins,hrs;
    private boolean stopped = false;

    Timer(Context context){
        super(context);
    }

    Timer (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    Timer(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
    }

    public void start(){
        if(stopped){
            startTime = System.currentTimeMillis() - elapsedTime; 
        }
        else{
            startTime = System.currentTimeMillis();
        }
        handler.removeCallbacks(startTimer);
        handler.postDelayed(startTimer, 0);
    }

    public void stop(){
        handler.removeCallbacks(startTimer);
        stopped = true;
    }

    private Runnable startTimer = new Runnable() {
           public void run() {
               elapsedTime = System.currentTimeMillis() - startTime;
               updateTimer(elapsedTime);
               handler.postDelayed(this,REFRESH_RATE);
           }
        };

    private void updateTimer (float time){
        secs = (long)(time/1000);
        mins = (long)((time/1000)/60);
        hrs = (long)(((time/1000)/60)/60);

        /* Convert the seconds to String 
         * and format to ensure it has
         * a leading zero when required
         */
        secs = secs % 60;
        seconds=String.valueOf(secs);
    if(secs == 0){
        seconds = "00";
    }
    if(secs <10 && secs > 0){
        seconds = "0"+seconds;
    }

        /* Convert the minutes to String and format the String */

    mins = mins % 60;
        minutes=String.valueOf(mins);
    if(mins == 0){
        minutes = "00";
    }
    if(mins <10 && mins > 0){
        minutes = "0"+minutes;
    }

    /* Convert the hours to String and format the String */

    hours=String.valueOf(hrs);
    if(hrs == 0){
        hours = "00";
    }
    if(hrs <10 && hrs > 0){
        hours = "0"+hours;
    }

    /* Although we are not using milliseconds on the timer in this example
     * I included the code in the event that you wanted to include it on your own
     */
    milliseconds = String.valueOf((long)time);
    if(milliseconds.length()==2){
        milliseconds = "0"+milliseconds;
    }
    if(milliseconds.length()<=1){
        milliseconds = "00";
    }
        milliseconds = milliseconds.substring(milliseconds.length()-3, milliseconds.length()-2);

        /* Setting the timer text to the elapsed time */
        this.setText(minutes + ":" + seconds + "." + milliseconds);
        //activity.((TextView)findViewById(R.id.timerMs)).setText("." + milliseconds);
    }
}
公共类计时器扩展了TextView{
私有处理程序=新处理程序();
私人长启动时间;
私密时间长;
私有最终整数刷新率=100;
私有字符串小时、分钟、秒、毫秒;
私人长秒,分钟,小时;
私有布尔停止=false;
计时器(上下文){
超级(上下文);
}
计时器(上下文、属性集属性){
超级(上下文,attrs);
}
计时器(上下文、属性集属性、int defStyle){
超级(上下文、属性、定义样式);
}
公开作废开始(){
如果(停止){
startTime=System.currentTimeMillis()-elapsedTime;
}
否则{
startTime=System.currentTimeMillis();
}
handler.removeCallbacks(startTimer);
postDelayed(startTimer,0);
}
公共停车场(){
handler.removeCallbacks(startTimer);
停止=真;
}
private Runnable startTimer=new Runnable(){
公开募捐{
elapsedTime=System.currentTimeMillis()-startTime;
更新时间(elapsedTime);
handler.postDelayed(这是刷新率);
}
};
私有void updateTimer(浮动时间){
秒=(长)(时间/1000);
分钟=(长)((时间/1000)/60);
小时=(长)((时间/1000)/60)/60);
/*将秒转换为字符串
*和格式,以确保
*需要时前导零
*/
秒=秒%60;
秒=字符串.valueOf(秒);
如果(秒=0){
秒数=“00”;
}
如果(秒0){
秒=“0”+秒;
}
/*将分钟数转换为字符串并格式化字符串*/
分钟=分钟%60;
分钟=字符串.valueOf(分钟);
如果(分钟==0){
分钟=“00”;
}
如果(分钟0){
分钟=“0”+分钟;
}
/*将小时数转换为字符串并格式化字符串*/
小时=字符串的值(小时);
如果(小时==0){
小时数=“00”;
}
若有(小时0){
小时数=“0”+小时数;
}
/*虽然在本例中我们没有在计时器上使用毫秒
*我将代码包含在您希望自己包含的事件中
*/
毫秒=String.valueOf((长)时间);
if(毫秒.length()==2){
毫秒=“0”+毫秒;
}

如果(毫秒.length()您需要有这些构造函数

你也有

this.setText(milliSeconds + ":" + seconds + ":" + minutes);
不能从非ui线程更新ui

阅读

编辑:

你有什么

public class Timer extends TextView{
<de.lipsksoft.apps.anwendung.t6student.TimerView // TimerView is not the same as Timer
然后在xml中

public class Timer extends TextView{
<de.lipsksoft.apps.anwendung.t6student.TimerView // TimerView is not the same as Timer
然后是xml

我的包裹名称不同

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
<com.example.testall.TimerView
        android:id="@+id/timer1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TimerView" />
</RelativeLayout>

然后

公共类TimerView扩展了TextView{
私有处理程序=新处理程序();
私人长启动时间;
私密时间长;
私有最终整数刷新率=100;
私有字符串小时、分钟、秒、毫秒;
私人长秒,分钟,小时;
私有布尔停止=false;
公共时间视图(上下文){
超级(上下文);
//start();
}
公共TimerView(上下文、属性集属性){
超级(上下文,attrs);
//start();
}
公共TimerView(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
//start();
}
公开作废开始(){
如果(停止){
startTime=System.currentTimeMillis()-elapsedTime;
}
否则{
startTime=System.currentTimeMillis();
}
handler.removeCallbacks(startTimer);
postDelayed(startTimer,0);
}
公共停车场(){
handler.removeCallbacks(startTimer);
停止=真;
}
private Runnable startTimer=new Runnable(){
公开募捐{
elapsedTime=System.currentTimeMillis()-startTime;
更新时间(elapsedTime);
handler.postDelayed(这是刷新率);
}
};
私有void updateTimer(浮动时间){
秒=(长)(时间/1000);
分钟=(长)((时间/1000)/60);
小时=(长)((时间/1000)/60)/60);
/*将秒转换为字符串
*和格式,以确保
*需要时前导零
*/
秒=秒%60;
秒=字符串.valueOf(秒);
如果(秒=0){
秒数=“00”;
}
如果(秒0){
秒=“0”+秒;
}
/*将分钟数转换为字符串并格式化字符串*/
分钟=分钟%60;
分钟=字符串.valueOf(分钟);
如果(分钟==0){
分钟=“00”;
}
如果(分钟0){
分钟=“0”+分钟;
}
/*将小时数转换为字符串并格式化字符串*/
小时=字符串的值(小时);
如果(小时==0){
小时数=“00”;
}
若有(小时0){
小时数=“0”+小时数;
}
/*虽然在本例中我们没有在计时器上使用毫秒
*我将代码包含在您希望自己包含的事件中
*/
毫秒=String.valueOf((长)时间);
if(毫秒.length()==2){
毫秒=“0”+毫秒;
}

if(毫秒.length()发布xml。你也从一个线程更新ui。这是错误的。为什么?我想我需要这个线程用于更新目的?因为ui只从ui线程更新。阅读文档进程和线程,但我如何实现秒表功能?要有一个计时器,你可以使用
倒数计时器
处理程序
。计时器在不同的时间运行ent线程和ui可以从ui线程自动更新抱歉…这不是问题。我只是忘记了更新xml部分
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
<com.example.testall.TimerView
        android:id="@+id/timer1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TimerView" />
</RelativeLayout>
public class TimerView extends TextView{

    private Handler handler = new Handler();
    private long startTime;
    private long elapsedTime;
    private final int REFRESH_RATE = 100;
    private String hours,minutes,seconds,milliseconds;
    private long secs,mins,hrs;
    private boolean stopped = false;

    public TimerView(Context context){
        super(context);
        //start();
    }

    public TimerView(Context context, AttributeSet attrs) {
        super(context, attrs);
        //start();
    }

    public TimerView(Context context, AttributeSet attrs, int defStyle){
        super(context, attrs, defStyle);
        //start();
    }

    public void start(){
        if(stopped){
            startTime = System.currentTimeMillis() - elapsedTime; 
        }
        else{
            startTime = System.currentTimeMillis();
        }
        handler.removeCallbacks(startTimer);
        handler.postDelayed(startTimer, 0);
    }

    public void stop(){
        handler.removeCallbacks(startTimer);
        stopped = true;
    }

    private Runnable startTimer = new Runnable() {
           public void run() {
               elapsedTime = System.currentTimeMillis() - startTime;
               updateTimer(elapsedTime);
               handler.postDelayed(this,REFRESH_RATE);
           }
        };

    private void updateTimer (float time){
        secs = (long)(time/1000);
        mins = (long)((time/1000)/60);
        hrs = (long)(((time/1000)/60)/60);

        /* Convert the seconds to String 
         * and format to ensure it has
         * a leading zero when required
         */
        secs = secs % 60;
        seconds=String.valueOf(secs);
    if(secs == 0){
        seconds = "00";
    }
    if(secs <10 && secs > 0){
        seconds = "0"+seconds;
    }

        /* Convert the minutes to String and format the String */

    mins = mins % 60;
        minutes=String.valueOf(mins);
    if(mins == 0){
        minutes = "00";
    }
    if(mins <10 && mins > 0){
        minutes = "0"+minutes;
    }

    /* Convert the hours to String and format the String */

    hours=String.valueOf(hrs);
    if(hrs == 0){
        hours = "00";
    }
    if(hrs <10 && hrs > 0){
        hours = "0"+hours;
    }

    /* Although we are not using milliseconds on the timer in this example
     * I included the code in the event that you wanted to include it on your own
     */
    milliseconds = String.valueOf((long)time);
    if(milliseconds.length()==2){
        milliseconds = "0"+milliseconds;
    }
    if(milliseconds.length()<=1){
        milliseconds = "00";
    }
        milliseconds = milliseconds.substring(milliseconds.length()-3, milliseconds.length()-2);

        /* Setting the timer text to the elapsed time */
        this.setText(minutes + ":" + seconds + "." + milliseconds);
        //activity.((TextView)findViewById(R.id.timerMs)).setText("." + milliseconds);
    }
}