简体   繁体   English

在 Android 中的 ProgressBar 上的 setVisibility

[英]setVisibility on ProgressBar in Android

I have the following progress bar in my Android application:我的 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" />

I also have an ImageView with an image in it.我还有一个带有图像的 ImageView。 What I want to do is while I'm making a call to an API, make the image invisible and show the ProgressBar in its place, then when it ends show the image again and hide the ProgressBar.我想做的是在调用 API 时,使图像不可见并在其位置显示 ProgressBar,然后在结束时再次显示图像并隐藏 ProgressBar。 However, this does not work:但是,这不起作用:

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) {
                    
                }
            }
        });

I've tried various combinations with View.INVISIBLE and View.GONE, nothing works.我尝试了 View.INVISIBLE 和 View.GONE 的各种组合,但没有任何效果。 I've also searched through similar questions on here but none of them answers my question.我也在这里搜索过类似的问题,但没有一个回答我的问题。

I thought maybe it's because it disappears and reappears so quickly I don't notice it, but even if I do Thread.sleep() the progress bar still doesn't show up.我想可能是因为它消失和重新出现的速度太快了,我没有注意到它,但即使我执行 Thread.sleep() 进度条仍然没有出现。

What am I doing wrong?我究竟做错了什么?

Calling thread.join() within OnClickListener blocks the UI thread and hence block any UI updates.在 OnClickListener 中调用OnClickListener thread.join()会阻塞 UI 线程,因此会阻塞任何 UI 更新。

To fix your code, you can remove thread.join() and put progressBar.setVisibility(View.INVISIBLE);image.setVisibility(View.VISIBLE);要修复您的代码,您可以删除thread.join()并放置progressBar.setVisibility(View.INVISIBLE);image.setVisibility(View.VISIBLE); within run() after makeRequest() but warp with runOnUiThread()在 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