进度栏的启动画面

时间:2012-07-12 21:06:54

标签: android mono xamarin.android

  

可能重复:
  Android Activity Life Cycle

我可以使用主题为我的应用创建一个简单的启动画面,它工作得很好。但是,有时应用程序需要刷新大量数据,我想向用户显示ProgressBar,让他们知道在等待时发生了什么。所以我抛弃了主题并创建了一个布局资源,并将其设置为我的Splash Activity的ContentView,但没有显示任何内容。我的内容不仅没有显示(完全黑屏),而且尽管试图以可能的方式隐藏标题栏,标题栏仍会继续显示。

Splash.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:gravity="center">
<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="15dp"
    android:src="@drawable/logo" />
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center">
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginRight="10dp" />
    <TextView
        android:id="@+id/progressText"
        android:text="Loading..."
        android:textSize="20dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp" />
</LinearLayout>

Splash.cs

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

        RequestWindowFeature(WindowFeatures.NoTitle);

        Window.SetFlags(WindowManagerFlags.Fullscreen, WindowManagerFlags.Fullscreen);

        SetContentView(Resource.Layout.Splash);

        string lastUpdated = PreferenceManager.GetDefaultSharedPreferences(this).GetString("LastInventoryUpdate", null);

        DateTime lastUpdateDate = Convert.ToDateTime(lastUpdated);

        TimeSpan span = DateTime.Today - lastUpdateDate;

        if (string.IsNullOrEmpty(lastUpdated) || span.Days > 30)
        {
            TextView progressText = (TextView)FindViewById(Resource.Id.progressText);
            progressText.Text = "Updating parts database.  May take several minutes...";
            InventoryRepository repository = ((MyApp)Application).Inventory;
            repository.Execute();
        }

        StartActivity(typeof(Login));
    }
}

仍然在标题栏中显示徽标和标题,内容绝对没有。甚至尝试将所有AsyncTask和StartActivity东西都拿出来,并尝试使用splash布局加载Activity。它最终会显示出来,但它会在很长一段时间内显示为黑屏。无法想象为什么因为这是我的主要发射器而且确实没有任何事情可以进行,但设定了活动的内容。

就TitleBar出现而言,我也尝试将其添加到我的清单中(我目前在其他活动中工作得很好)

<activity android:name="app.MyApp.Splash" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"></activity>

如果我为活动添加了一个主题,则TitleBar会消失,但我的布局资源永远不会显示。

1 个答案:

答案 0 :(得分:1)

经过一整天的挣扎,我不知道在发布后我发现问题的大部分时间。简而言之,我把主题放回到Splash Activity上,它现在显示所有内容都是最初加载的,并且通常在内容设置之前重定向到Login,这是完美的。但我改变了我的OnCreate如下:

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

        RequestWindowFeature(WindowFeatures.NoTitle);

        Window.SetFlags(WindowManagerFlags.Fullscreen, WindowManagerFlags.Fullscreen);

        SetContentView(Resource.Layout.Splash);

        string lastUpdated = PreferenceManager.GetDefaultSharedPreferences(this).GetString("LastInventoryUpdate", null);

        DateTime lastUpdateDate = Convert.ToDateTime(lastUpdated);

        TimeSpan span = DateTime.Today - lastUpdateDate;

        if (string.IsNullOrEmpty(lastUpdated) || span.Days > 30)
        {
            SetTheme(Resource.Drawable.bg_black);
            TextView progressText = (TextView) FindViewById(Resource.Id.progressText);
            progressText.Text = "Updating parts database.  May take several minutes...";
            InventoryRepository repository = ((MyApp) Application).Inventory;
            repository.Execute();
        }
        else
            StartActivity(typeof (Login));
    }
}

主要区别在于,如果我没有运行AsyncTask,我只调用StartActivity。否则,我从AsyncTask的OnPostExecute调用StartActivity。此外,请务必在启动布局中设置所有视图的背景属性。由于我将主题留在活动上,如果您不这样做,您的主题将显示为每个视图的背景。