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