代码之家  ›  专栏  ›  技术社区  ›  오영택

重新单击按钮时重置进度条[关闭]

  •  0
  • 오영택  · 技术社区  · 7 年前

    这段代码意味着,如果单击按钮,进度条将从0%到100%开始。当我在进度条达到100%之前单击按钮时,我想重置进度条。

    这是我代码的一部分。

    此代码是按钮侦听器。

    public void Cal_btn(View v) {
    
        Message msg;
        switch (v.getId()) {
            case R.id.Square:
                if (Number.getText().toString().length() == 0) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요.", Toast.LENGTH_LONG).show();
                } else {
                    pThread = new ProThread(pHandler);
                    pThread.setDaemon(true);
                    pThread.start();
    
                    Cal_Result.setVisibility(View.GONE);
                    progress.setVisibility(View.VISIBLE);
                    msg = new Message();
                    msg.what = 1;
                    msg.arg1 = Integer.parseInt(Number.getText().toString());
                    mThread.mBackHandler.sendMessage(msg);
                }
                break;
        }
    }
    

    这段代码就是handler。

    Handler pHandler = new Handler(){
    
        public void handleMessage(Message msg){
            if(msg.what == 3){
                if(msg.arg1 == 100){
                    Cal_Result.setVisibility(View.VISIBLE);
                    progress.setVisibility(View.GONE);
                }else{
                    progress.setProgress(msg.arg1);
                }
            }
        }
    };
    

    这个代码是线程运行代码。

    class ProThread extends Thread{
        int proNum = 0;
        Handler pHandler;
        ProThread(Handler handler){
            pHandler = handler;
        }
    
        public void run(){
            while(proNum != 100) {
                proNum++;
                Message msg = new Message();
                msg.what = 3;
                msg.arg1 = proNum;
                pHandler.sendMessage(msg);
                try {
                    Thread.sleep(10);
                }catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   dev.farmer    7 年前

    添加一个布尔成员变量作为“ProgressBar”是否已启动的标记。

    boolean isProgressBarRun;
    

    单击按钮时,更改此变量的状态。 如果第一次单击该按钮,请发送消息。 处理消息时,请使用“public void handleMessage(message msg)”方法每隔10毫秒重新发送一次消息。

    您的onClick方法可以编写如下:

    boolean isProgressBarRun = false;
    
    ...
    
    public void Cal_btn(View v) {
    
        Message msg;
        switch (v.getId()) {
            case R.id.Square:
                if (Number.getText().toString().length() == 0) {
                    Toast.makeText(getApplicationContext(), "숫자를 입력하세요.", Toast.LENGTH_LONG).show();
                } else {
                    if (isProgressBarRun) {
                        isProgressBarRun = false;
                        msg = new Message();
                        msg.what = 4; // to stop the progress bar
                        mThread.mBackHandler.sendMessage(msg);
                        msg.what = 3;
                        msg.arg1 = Integer.parseInt(Number.getText().toString());
                        mThread.mBackHandler.sendMessage(msg);
                    } else {
                        isProgressBarRun = true;
                        Cal_Result.setVisibility(View.GONE);
                        progress.setVisibility(View.VISIBLE);
                        msg = new Message();
                        msg.what = 1;
                        msg.arg1 = Integer.parseInt(Number.getText().toString());
                        mThread.mBackHandler.sendMessage(msg);
                    }
                }
                break;
        }
    }
    

    您的处理程序可以按如下方式更改:

    Handler pHandler = new Handler(){
        public void handleMessage(Message msg){
            if(msg.what == 4){
                progress.setVisibility(View.GONE);
            } else {
                progress.setProgress(msg.arg1);
                Message message = new Message();
                message .what = 3;
                message .arg1 = msg.arg1 + 1;
                pHandler.sendMessageDelayed(message, 10);
            }
        }
    };
    

    总之,您不需要实现线程。 上面的代码不正确,请看概念。