Search code examples
c#xamarin.androidprogress-bar

How to show ProgressBar and make it progress?(Xamarin.Android)


I call a web service which gets 4 files, and while these files are loading, I want to show progress to the user (circular or horizontal it doesn't matter). I've followed the examples on internet, but nothing appears on screen.

MobileSellReference.Service1 service = new MobileSellReference.Service1();
service.Url = settings.Synchronization.Msellurl;
ProgressBar progressBar = FindViewById<ProgressBar>(Resource.Id.progressBar);
progressBar.Max = 100;
progressBar.Progress = 0;
byte[][] basedataResult = service.ToPPC(basedataZipName, objectId);
progressBar.IncrementProgressBy(25);
byte[][] dutybasedataResult = service.ToPPC(dutybasedataZipName, objectId);
progressBar.IncrementProgressBy(25);
byte[][] tranbasedataResult = service.ToPPC(tranbasedataZipName, objectId);
progressBar.IncrementProgressBy(25);
byte[][] vendbasedataResult = service.ToPPC(vendbasedataZipName, objectId);
progressBar.IncrementProgressBy(25);

I've found a lot of examples using external progressbar libraries but they all want to change the theme of the Activity. Instead I want some simple ProgressBar built into Xamarin.Android. For example when the first file is downloaded I want 1/4 of the circle to be filled, when 2 files are downloaded 1/2 of the circle to be filled et cetera. Similarly for a horizontal ProgressBar.


Solution

  • Use AsyncTask

    .axml file:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:id="@+id/tv"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="0" />
        <ProgressBar
            android:id="@+id/pb"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            style="?android:attr/progressBarStyleHorizontal" />
    </LinearLayout>
    

    MainActivity:

    public class MainActivity : Activity
    {
        ProgressBar pb;
        TextView tv;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
    
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            pb = FindViewById<ProgressBar>(Resource.Id.pb);
            tv = FindViewById<TextView>(Resource.Id.tv);
            UpdatePB uptask = new UpdatePB(this,pb,tv);
            uptask.Execute(100);
        }
    
       public class UpdatePB : AsyncTask<int, int, string>
        {
            Activity mcontext;
            ProgressBar mpb;
            TextView mtv;
            public UpdatePB(Activity context,ProgressBar pb,TextView tv) {
                this.mcontext = context;
                this.mpb = pb;
                this.mtv = tv;
            }
            protected override string RunInBackground(params int[] @params)
            {
                // TODO Auto-generated method stub
                for (int i = 1; i <= 4; i++)
                {
                    try
                    {
                        Thread.Sleep(3000);
                    }
                    catch (InterruptedException e)
                    {
                        // TODO Auto-generated catch block
                        Android.Util.Log.Error("lv",e.Message);
                    }
                    mpb.IncrementProgressBy(25);
                    PublishProgress(i * 25);
    
                }
                return "finish";
            }
    
            protected override void OnProgressUpdate(params int[] values)
            {
                mtv.Text = String.ValueOf(values[0]);
                Android.Util.Log.Error("lv==", values[0] + "");
            }
            protected override void OnPostExecute(string result)
            {
                mcontext.Title = result;
            }
           
    
        }
    }