Style - wylaczone z elementu XML grupy podelementow formatujacych (zapisywane w predefiniowanym pliku res/values/styles.xml) Temat - styl stosowany do calej aktywnosci Częściowo na podstawie: http://stackoverflow.com/questions/5442183/using-the-animated-circle-in-an-imageview-while-loading-stuff Aplikacja będzie pokazywała pierścień (ikona oczekiwania). 1. Tworzymy projekt aplikacji Android o nazwie Uslugi z szablonu Android App (Xamarin), Blank App 2. W pliku activity_main.axml dodajemy panel z paskiem postępu: 3. Style StylTlaPierscienia i StylPierscienia określające wygląd panelu i umieszczonego w jego centrum pierścienia zdefiniowane są w pliku res/values/styles.xml. W pliku tym jest już predefiniowany temat aktywności. 4. W pliku res/values/strings.xml dodaję wartość łańcucha init: Pierscien Settings Trwa inicjowanie widoku <------------ 5. Uruchamiamy program. Pierścień na półprzezroczystym zielonym tle kręci się w nieskończoność. W najprostszym scenariuszu inicjacja interfejsu mogłaby się odbywać metodzie onCreate (plik MainActivity.java), po czym panel z pierścieniem byłby ukrywany (zob. kod poniżej). To jednak nie zadziała, bo żeby powstał panel z pierścieniem metoda onCreate musi zakończyć swoje działanie. A na jej końcu panel jest ukrywany. W efekcie nigdy go nie zobaczymy. using ... namespace Pierscien { [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)] public class MainActivity : AppCompatActivity { protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.activity_main); //inicjacja w watku UI blokuje tworzenie panela pierscienia try { Java.Lang.Thread.Sleep(5000); //zamiast tego powinno byc inicjowanie widoku Toast.MakeText(this, "Inicjacja zakończona", ToastLength.Short).Show(); } catch (Java.Lang.InterruptedException exc) { Toast.MakeText(this, "Inicjacja przerwana", ToastLength.Short).Show(); } finally { View panelPierscienia = FindViewById(Resource.Id.panelPierscienia); panelPierscienia.Visibility = ViewStates.Gone; Toast.MakeText(this, "Panel pierściania ukryty", ToastLength.Short).Show(); } } } } ------------------- Wstęp do wątków [Zasadniczo aplikacje Androida są jednowątkowe (dotyczy to także usług uruchamianych w ramach aplikacji).] 6. Rozwiązaniem jest utworzenie dodatkowego wątku, który będzie tworzony w MainActivity.OnCreate, ale będzie wykonywany niezależnie od wątku interfejsu (ang. UI thread). Zmieniamy wobec tego zawartość tej metody: [Uwaga! Próba wywołania toastu, czy w ogóle dostępu do kontrolek z wątku innego niż wątek UI spowoduje błąd (spróbować - wystarczy użyć oryginalnego kodu wstawionego do wątku). Należy używać RunOnUiThread. Stąd metoda pokazToast.] using Android.App; using Android.OS; using Android.Support.V7.App; using Android.Runtime; using Android.Widget; using Android.Views; namespace Pierscien { [Activity(Label = "@string/app_name", Theme = "@style/AppTheme", MainLauncher = true)] public class MainActivity : AppCompatActivity { private void pokażToast(string komunikat) { RunOnUiThread(() => { Toast.MakeText(this, komunikat, ToastLength.Short).Show(); }); } protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.activity_main); Java.Lang.Thread t = new Java.Lang.Thread( () => { try { Java.Lang.Thread.Sleep(5000); //zamiast tego powinno byc inicjowanie widoku pokażToast("Działanie wątku zakończone"); } catch (Java.Lang.InterruptedException exc) { pokażToast("Działanie wątku przerwane"); } finally { RunOnUiThread( () => { View panelPierscienia = FindViewById(Resource.Id.panelPierscienia); panelPierscienia.Visibility = ViewStates.Gone; Toast.MakeText(this, "Panel pierściania ukryty", ToastLength.Short).Show(); }); } } ); t.Start(); } } } Teraz panel widoczny jest przez 5 sekund (tyle trwa Thread.sleep, który symuluje polecenia inicjujące UI), a potem jest ukrywany. Więcej w: http://www.xoriant.com/blog/mobile-application-development/android-async-task.html