点击按钮后显示ProgressBar 5秒再显示TextView的Java实现
没问题,我来帮你搞定这个需求!下面是完整的实现方案,包括布局和Java代码,还有关键细节的说明:
1. 编写布局文件(
res/layout/activity_main.xml) 先把需要的控件都放进去,记得给ProgressBar和TextView默认设置invisible状态:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="16dp" android:gap="16dp"> <!-- 输入框 --> <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入内容"/> <!-- 触发按钮 --> <Button android:id="@+id/actionButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始执行"/> <!-- 进度条,默认隐藏 --> <ProgressBar android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="invisible" android:layout_gravity="center_horizontal"/> <!-- 结果文本,默认隐藏 --> <TextView android:id="@+id/resultText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="操作完成!" android:visibility="invisible" android:layout_gravity="center_horizontal" android:textSize="18sp"/> </LinearLayout>
2. Java逻辑代码(
MainActivity.java) 这里实现点击按钮后的核心逻辑,重点是用Handler处理延迟任务,同时注意避免内存泄漏:
import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private ProgressBar progressBar; private TextView resultText; private Button actionButton; // 用静态内部类Handler避免内存泄漏 private static class MyHandler extends Handler { private final MainActivity activity; MyHandler(MainActivity activity) { this.activity = activity; } @Override public void handleMessage(android.os.Message msg) { if (msg.what == 1) { // 5秒后切换控件状态 activity.progressBar.setVisibility(View.INVISIBLE); activity.resultText.setVisibility(View.VISIBLE); // 恢复按钮可点击状态,防止重复触发 activity.actionButton.setEnabled(true); } } } private final MyHandler handler = new MyHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化控件 progressBar = findViewById(R.id.progressBar); resultText = findViewById(R.id.resultText); actionButton = findViewById(R.id.actionButton); // 设置按钮点击事件 actionButton.setOnClickListener(v -> { // 点击后先禁用按钮,避免重复操作 actionButton.setEnabled(false); // 隐藏之前可能显示的文本 resultText.setVisibility(View.INVISIBLE); // 显示进度条 progressBar.setVisibility(View.VISIBLE); // 延迟5秒执行后续操作(5000毫秒=5秒) handler.sendEmptyMessageDelayed(1, 5000); }); } @Override protected void onDestroy() { super.onDestroy(); // 移除所有未执行的回调,彻底避免内存泄漏 handler.removeCallbacksAndMessages(null); } }
关键细节说明
- 禁用按钮:点击后先把按钮设为不可用,防止用户重复点击触发多次延迟任务
- 内存泄漏防护:用静态内部类
Handler+onDestroy移除回调,避免Activity销毁后还被引用 - 状态重置:每次点击都先隐藏
TextView,确保重新执行时界面状态正确
补充:用CountDownTimer实现(可选)
如果觉得Handler的方式不够直观,也可以用Android自带的CountDownTimer,代码可读性更强:
// 替换按钮点击事件里的延迟部分 new CountDownTimer(5000, 1000) { @Override public void onTick(long millisUntilFinished) { // 要是用的是横向进度条,还能在这里实时更新进度 } @Override public void onFinish() { progressBar.setVisibility(View.INVISIBLE); resultText.setVisibility(View.VISIBLE); actionButton.setEnabled(true); } }.start();
内容的提问来源于stack exchange,提问作者Miraz
相关产品推荐
相关产品推荐

