You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android项目:ProgressDialog替换为ProgressBar及按钮无响应排查

问题解答

1. ProgressDialog废弃是否是按钮无响应的原因?

ProgressDialog自API 26起被标记为废弃,但本身不会直接导致按钮点击无响应。不过在Android 13+系统中,旧Dialog的实现可能存在兼容性问题(如窗口权限、主题适配),间接干扰点击逻辑执行。从你的代码来看,建议先排查基础问题:

  • 布局中按钮是否被其他View遮挡
  • 按钮ID是否与布局文件中一致
  • 可在点击事件内添加try-catch捕获潜在未打印异常

但既然ProgressDialog已被废弃,替换为ProgressBar不仅能解决兼容性隐患,也符合Android最新开发规范。

2. 改用ProgressBar的具体修改步骤

步骤1:更新布局文件(activity_main.xml)

在布局中添加一个默认隐藏的加载提示布局,包含ProgressBar和提示文本:

<!-- 加载遮罩布局,默认隐藏 -->
<LinearLayout
    android:id="@+id/loading_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical"
    android:visibility="gone"
    android:background="#80000000">

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:indeterminate="true"/>

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Looking for a player, please wait ..."
        android:textColor="@android:color/white"
        android:layout_marginTop="16dp"/>
</LinearLayout>

步骤2:修改Activity代码

首先声明加载布局控件:

private LinearLayout loadingLayout;

然后在onCreate方法中初始化控件,并替换ProgressDialog的显示逻辑:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    final Context context = this;
    FirebaseUser firebaseuser = FirebaseAuth.getInstance().getCurrentUser();
    uid = firebaseuser.getUid();
    user = firebaseuser.getDisplayName();
    mDatabase = FirebaseDatabase.getInstance().getReference().child("users").child(uid);
    mDatabase_status = FirebaseDatabase.getInstance().getReference().child("users").child(uid).child("status");
    kullanici = new database();
    kullanici.status(mDatabase, "off");

    // 保留原有Firebase监听逻辑...

    setContentView(R.layout.activity_main);
    btn = (Button)findViewById(R.id.button4);
    // 初始化加载布局
    loadingLayout = findViewById(R.id.loading_layout);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            try {
                mDatabase_status.addValueEventListener(postListener_status);
                kullanici.status(mDatabase, "waiting");
                // 显示加载布局
                loadingLayout.setVisibility(View.VISIBLE);
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(context, "操作出错:" + e.getMessage(), Toast.LENGTH_SHORT).show();
            }
        }
    });
}

步骤3:更新状态监听中的隐藏逻辑

将原来的dialog.hide()替换为隐藏加载布局的代码,同时在请求失败时也需隐藏:

postListener_status = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot != null && dataSnapshot.getValue() != null) {
            String userstatus = String.valueOf(dataSnapshot.getValue());
            if ("on".equals(userstatus)) {
                // 隐藏加载布局
                loadingLayout.setVisibility(View.GONE);
                mDatabase.removeEventListener(postListener);
                mDatabase_status.removeEventListener(postListener_status);
                Intent intocan = new Intent(MainActivity.this, ikinciekren.class);
                startActivity(intocan);
            }
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        // 请求失败时隐藏加载布局
        loadingLayout.setVisibility(View.GONE);
        Context context = getApplicationContext();
        Toast.makeText(context, "Failed to load post.", Toast.LENGTH_SHORT).show();
    }
};

额外优化

  • 删除原有ProgressDialog相关变量(如dialog)
  • 给加载布局添加空点击事件,防止用户在加载时误触底层控件:
loadingLayout.setOnClickListener(v -> {});

内容的提问来源于stack exchange,提问作者Faruk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:28:27