【问题标题】:Set progressBar to a function Android将progressBar设置为Android函数
【发布时间】:2013-08-02 12:05:25
【问题描述】:

我有一个功能,可以在我的手机上更新联系人列表。当联系人更新时,我需要放置一个进度条。我需要在更新功能中添加一个进度条。我怎么做?更新功能运行良好,我只需要一个进度条来显示它正在更新。请帮忙。

 public void onClick(View v){

                //reset progress bar status
                progressBarStatus = 0;

                //reset filesize
                fileSize = 0;

                new Thread(new Runnable() {
                    public void run() {
                        while (progressBarStatus < 100) {

                            // process some tasks
                            progressBarStatus = UpdateContact();

                            // your computer is too fast, sleep 1 second
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            // Update the progress bar
                            progressBarHandler.post(new Runnable() {
                                public void run() {
                                    progressBar.setProgress(progressBarStatus);
                                }
                            });
                        }

                        // ok, file is downloaded,
                        if (progressBarStatus >= 100) {

                            // sleep 2 seconds, so that you can see the 100%
                            try {
                                Thread.sleep(2000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }

                            // close the progress bar dialog
                            progressBar.dismiss();
                        }
                    }


                }).start();

            }

        });

【问题讨论】:

  • 你为什么不放一个旋转的圆圈。这将更直观,如果您放置进度条,用户将难以理解正在发生的事情:)
  • 这里有一个很好的例子-> stackoverflow.com/questions/15585749/… .
  • 或者简单地 - &lt;ProgressBar android:id="@+id/pb" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_centerInParent="true" android:layout_height="wrap_content" /&gt; 并使用它的可见性(例如,在 onCreate() 中将其设置为 GONE,然后在 onClick() 的开头将其设置为 VISIBLE(以防万一) ) 并在最后再次将其设置为 GONE)。

标签: android progress-bar


【解决方案1】:

我认为带有AsyncTask 的解决方案会更优雅。 这是AsyncTask的示例代码:

import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;

public class MyAsyncTask<Params, Progress, Result> extends
    AsyncTask<Params, Progress, Result> {

    private final String DIALOG_MESSAGE = "Updating contacts";

    private ProgressDialog mDialog = null;

    private void setDialog(Context context) {
        this.mDialog = new ProgressDialog(context);
        this.mDialog.setMessage(DIALOG_MESSAGE);
        this.mDialog.setCancelable(false);
    }

    public MyAsyncTask(Context context) {
        this.setDialog(context);
    }

    @Override
    protected void onPreExecute() {
        this.mDialog.show();
    }

    @Override
    protected Result doInBackground(Params... arg0) {
        // Place your background executed method here
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return null;
    }

    @Override
    protected void onPostExecute(Result result) {
        // Update the UI if u need to

        // And then dismiss the dialog
        if (this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    }
}

这是调用异步的代码:

import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {

    private Context context = null;

    private Button btn = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        this.context = this;

        this.btn = (Button) this.findViewById(R.id.button1);
        this.btn.setOnClickListener(onClickUpdateContacts);

    }

    private OnClickListener onClickUpdateContacts = new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            MyAsyncTask<Void, Void, Void> updateTask = new MyAsyncTask<Void, Void, Void>(context);
            updateTask.execute();
        }

    };

}

您还可以轻松更改对话框的外观以匹配您应用的外观。 希望这个简单的代码可以帮助^^

【讨论】:

  • 上下文在该行中有下划线:MyAsyncTask updateTask = new MyAsyncTask(context);
  • 上下文在该行中有下划线: MyAsyncTask updateTask = new MyAsyncTask(context); @罗伯托
  • 我会添加完整的课程MainActivity,看看你是否错过了什么
  • 编辑完成。您的问题可能是由 context 变量的错误初始化引起的。检查您是否已正确初始化它。
  • 我很高兴它能帮助你^^
【解决方案2】:

使用这个:

这些函数将在 4 张图片之间不断改变加载,只需在更新联系人之前调用它,并在获取数据后调用 StopProgress()

XML 布局“progress_layout”:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@null"
    android:layout_gravity="center" >

    <ImageView
        android:id="@+id/progressbar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/loading"
        />

</RelativeLayout>

创建 2 个方法:StartProgress() 和 StopProgress()

private Dialog  progressDialog;
    int AdsIndex, AdsCount;
    Timer timer= new Timer();
    public void startProgress()
    {
        progressDialog = new Dialog(getActivity(), android.R.style.Theme_Translucent_NoTitleBar);
        progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        progressDialog.setCancelable(false);
        progressDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
        progressDialog.setContentView(R.layout.progress_layout);

        final ImageView img = (ImageView) progressDialog.findViewById(R.id.progressbar);
        final Integer drawableList[] = {R.drawable.loading, R.drawable.loading2, R.drawable.loading3, R.drawable.loading4};

        final Handler adsHandler = new Handler();    
         final Runnable adsUpdateResults = new Runnable() {
            public void run() {

                if(AdsCount > 0)
                {
                    img.setImageDrawable(getResources().getDrawable(drawableList[AdsIndex]) );

                     AdsIndex++;

                     if(AdsCount == AdsIndex)
                         AdsIndex = 0;
                }
            }
        };
        final int adsDelay = 200; // delay for xx sec.      
        final long adsPeriod = 200;//repet every xx seconds       

        timer.scheduleAtFixedRate(new TimerTask() {

            public void run() {
                adsHandler.post(adsUpdateResults);
            }

        }, adsDelay, adsPeriod);

        progressDialog.show();
    }

    public void stopProgress()
    {
        progressDialog.dismiss();
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-20
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    相关资源
    最近更新 更多