簡體   English   中英

在 Android 中的 ProgressBar 上的 setVisibility

[英]setVisibility on ProgressBar in Android

我的 Android 應用程序中有以下進度條:

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="200sp"
        android:layout_height="200sp"
        android:layout_marginTop="60sp"
        android:visibility="gone"
        android:indeterminate="true"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent" />

我還有一個帶有圖像的 ImageView。 我想做的是在調用 API 時,使圖像不可見並在其位置顯示 ProgressBar,然后在結束時再次顯示圖像並隱藏 ProgressBar。 但是,這不起作用:

searchBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ProgressBar progressBar = findViewById(R.id.progressBar);
                ImageView image = findViewById(R.id.image);

                image.setVisibility(View.INVISIBLE);
                progressBar.setVisibility(View.VISIBLE);

                Thread thread = new Thread(new Runnable() {
                    @Override
                    public void run() {
                         makeRequest();
                    }
                });
                thread.start();

                try {
                    thread.join();
                    progressBar.setVisibility(View.INVISIBLE);
                    image.setVisibility(View.VISIBLE);
                } catch (InterruptedException e) {
                    
                }
            }
        });

我嘗試了 View.INVISIBLE 和 View.GONE 的各種組合,但沒有任何效果。 我也在這里搜索過類似的問題,但沒有一個回答我的問題。

我想可能是因為它消失和重新出現的速度太快了,我沒有注意到它,但即使我執行 Thread.sleep() 進度條仍然沒有出現。

我究竟做錯了什么?

在 OnClickListener 中調用OnClickListener thread.join()會阻塞 UI 線程,因此會阻塞任何 UI 更新。

要修復您的代碼,您可以刪除thread.join()並放置progressBar.setVisibility(View.INVISIBLE);image.setVisibility(View.VISIBLE); 在 makeRequest( run() makeRequest() ,但與runOnUiThread()一起變形

searchBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ProgressBar progressBar = findViewById(R.id.progressBar);
        ImageView image = findViewById(R.id.image);

        image.setVisibility(View.INVISIBLE);
        progressBar.setVisibility(View.VISIBLE);

        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                makeRequest();
                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        progressBar.setVisibility(View.INVISIBLE);
                        image.setVisibility(View.VISIBLE);            
                    }
                });
            }
        });
        thread.start();
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM