2011-07-03 133 views
2

如何在程序启动时实现简单的“启动画面”?我正在复制一个SQLite数据库,它可能是一个很长的过程,不是UI“友好”的。MonoDroid启动画面

我不想使用“java代码”。

TIA

回答

4

我最近用下面的方法解决了这个问题。

在主要活动中,我通过意图设置闪烁屏幕保持可见的毫秒数来传递参数。

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(); 
    } 

} 
+0

Bob,谢谢你的工作。我需要添加一个“使用System.Threading”。 – Fritz

+0

鲍勃,谢谢。我需要相同的... – Saeed

4

另见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)); 
    } 
} 
+0

在我看来,没有更好的方法来解决这个问题。 谢谢! –

+0

我遇到了麻烦让这个工作的景观启动画面我设置'ScreenOrientation = ScreenOrientation.Landscape'里面的飞溅活动属性(和我的主要活动也有它),但这会导致不显示启动画面。如果我只是使用肖像飞溅,切换到主要活动时会旋转,这看起来有点奇怪。 – Aranda

0

该解决方案可以让你如下:

  • 立即显示闪屏
  • 去除启动画面的确切时间“主”活动启动(主要活动取代了防溅活动)

在OnCreate中,的setContentView被调用,以获得启动画面了,然后工人线程被启动,运行缓慢的处理数据初始化的东西。

这样,spalsh屏幕显示没有延迟。工作线程中的最后一条语句启动了“主”应用程序/活动,这将使其数据库的所有数据都准备好进行访问。从OnCreate调用StartActivity()(即在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)); 
     } 
    } 
} 
+0

3年来,你还没有到处实施从后台去除? ;) – Druid

+0

@德鲁伊我实际上可能会在不久的将来重新审视anroid。如果我愿意的话,我一定会回避一些后台移除! – samosaris

1

这为我工作:

起价飞溅活动的新线程。您可以等待几秒钟或加载一些数据或其他东西。

[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(); 
    } 
}