Экран-заставка MonoDroid - PullRequest
       1

Экран-заставка MonoDroid

2 голосов
/ 03 июля 2011

Как я могу реализовать простой "экран-заставку" при запуске программы? Я копирую базу данных SQLite, и это может быть длительным процессом, который не является дружественным для пользовательского интерфейса.

Я бы предпочел не использовать "код Java".

ТИА

Ответы [ 4 ]

4 голосов
/ 28 октября 2011

Также см. http://docs.xamarin.com/android/tutorials/Creating_a_Splash_Screen Действительно отличный учебник.

Требуется всего около 10 строк кода:)

В Styles.xml:

<resources>
  <style name="Theme.Splash" parent="android:Theme">
    <item name="android:windowBackground">@drawable/splash</item>
    <item name="android:windowNoTitle">true</item>
  </style>
</resources>

В вашей деятельности:

[Activity (MainLauncher = true, Theme = "@style/Theme.Splash", NoHistory = true)]
public class SplashActivity : Activity
{
    protected override void OnCreate (Bundle bundle)
    {
        base.OnCreate (bundle);

        // Create your async task here...
        StartActivity (typeof (Activity1));
    }
}
4 голосов
/ 05 июля 2011

Недавно я решил эту проблему следующим образом.

В основном задании я передал параметр через намерение установить количество миллисекунд, в течение которых заставка будет оставаться видимой.

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Set our view from the "main" layout resource
        SetContentView(Resource.Layout.Main);

        Intent i=new Intent();
        i.SetClass(this, typeof (Splash));
        i.PutExtra("Milliseconds", 3000);
        StartActivity(i);
    }

Затем во втором упражнении, которое я назвал «Всплеск», я извлек это значение и установил второй поток, чтобы завершить упражнение по истечении времени.

[Activity(Label = "Daraize Tech")]
public class Splash : Activity
{
    private int _milliseconds;
    private DateTime _dt;

    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        _milliseconds = Intent.GetIntExtra("Milliseconds", 1000);
        SetContentView(Resource.Layout.Splash);
        _dt=DateTime.Now.AddMilliseconds(_milliseconds);
     }

    public override void OnAttachedToWindow()
    {
        base.OnAttachedToWindow();

        new Thread(new ThreadStart(() =>
                                    {
                                    while (DateTime.Now < _dt)
                                        Thread.Sleep(10);
                                    RunOnUiThread( Finish );                                                   
                                    }
            )).Start();
    }

}
1 голос
/ 10 июля 2013

Это сработало для меня:

Запуск нового потока из всплывающей активности.Вы можете подождать несколько секунд или загрузить некоторые данные или что-то еще.

[Activity(MainLauncher = true, NoHistory = true)]
public class Splashscreen : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);
        SetContentView (Resource.Layout.splashscreen);

        new Thread (new ThreadStart (() =>
                                        {
                                            //Load something here ...
                                            Thread.Sleep(1500);

                                            Intent main = new Intent (this, typeof(MainActivity));
                                            this.StartActivity (main);
                                            this.Finish ();
                                        })).Start ();
    }
}
0 голосов
/ 08 мая 2013

Это решение дает вам следующее:

  • Немедленное отображение заставки
  • Удаление заставки точно в то время, когда запускается «основное» действие (основное действие заменяетвсплеск активности)

В OnCreate вызывается SetContentView, чтобы вызвать экран-заставку, а затем запускается рабочий поток, запускающий процесс инициализации данных с медленной обработкой.

ThisКстати, экран spalsh отображается без задержки.Последний оператор в рабочем потоке запускает «основное» приложение / действие, которое будет иметь доступ к своей базе данных и данным.Вызов StartActivity () из OnCreate (т. Е. После initializeDataWorker.Start ()) заставит MainActivity работать до / во время создания БД и / или выборки данных, что обычно нежелательно).

В этом решении отсутствует способ удаления заставки с заднего стека.Когда я доберусь до реализации этой функциональности, я обновлю ее.

namespace Mono.Droid
{
    [Activity(
        Label = "Splash Activity",
        MainLauncher = true, 
        Theme = "@android:style/Theme.Black.NoTitleBar", 
        Icon = "@drawable/icon",
        NoHistory = false)]

    public class SplashActivity : Activity
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.SplashLayout);

            Thread initializeDataWorker = new Thread(new ThreadStart(InitializeData));
            initializeDataWorker.Start();
        }        

        private void InitializeData()
        {
            // create a DB
            // get some data from web-service
            // ...

            StartActivity(typeof(MainActivity));
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...