重新单击按钮时进度条重置
Progress bar reset when button is re-clicked
此代码意味着如果我单击一个按钮,进度条将从 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 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);
}
}
}
};
而这段代码是Thread 运行代码。
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();
}
}
}
}
添加一个布尔成员变量作为"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);
}
}
};
总而言之,您不需要实现 Thread。
上面的代码不正确,请看概念。
此代码意味着如果我单击一个按钮,进度条将从 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 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);
}
}
}
};
而这段代码是Thread 运行代码。
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();
}
}
}
}
添加一个布尔成员变量作为"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);
}
}
};
总而言之,您不需要实现 Thread。 上面的代码不正确,请看概念。