zoukankan      html  css  js  c++  java
  • 【xamarin + MvvmCross 从零开始】七、Android 如何实现启动界面

    前言

    前几篇主要讲了一下Xamarin和MvvmCross开发的一些基本知识以及常见问题,从这篇开始我们讲一下Android开发中一些知识点。

    这一篇我说说如何通过MvvmCross实现启动界面。

    什么是启动界面

    要说起启动界面的历史那就很悠久了,在WinForm时期就已经存在了,那时的硬件落后,一个软件启动时往往要对主界面进行初始化、建立数据连接、加载数据,这个过程一般比较费时,为了不让用户认为系统已经挂掉,就在启动时先显示启动界面,并在界面上显示加载进度,以增加用户体验。

    如何实现启动界面

    那么在android中如何实现启动界面呢?这个就比较简单了,因为MvvmCross已经为我们封装好了启动界面,我只需要实现就可以,看代码:

    namespace MvvmCross.Droid.Views
    {
        [Register("mvvmcross.droid.views.MvxSplashScreenActivity")]
        public abstract class MvxSplashScreenActivity : MvxActivity, IMvxAndroidSplashScreenActivity
        {
            protected MvxSplashScreenActivity(int resourceId = 0);
    
            public MvxNullViewModel ViewModel { get; set; }
    
            public virtual void InitializationComplete();
            protected override void OnCreate(Bundle bundle);
            protected override void OnPause();
            protected override void OnResume();
            protected virtual void RequestWindowFeatures();
            protected virtual void TriggerFirstNavigate();
        }
    }

    这是MvvmCross中封装的SplashScreen对象,用于实现启动界面。MvxSplashScreenActivity继承于MvxActivity,也就是说这是一个标准的Activity。

    • 我们先添加一个启动界面的布局。
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:minWidth="25px"
        android:minHeight="25px">
        <TextView
            android:text="Hi! MvvmCross"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView1"
            android:layout_centerInParent="true"
            android:textSize="40dp" />
    </RelativeLayout>
    • 再添加启动界面的Activity:
    using Android.App;
    using Android.OS;
    using MvvmCross.Droid.Views;
    
    namespace MvxSample.Droid.Views
    {
        [Activity(Name = "SplashScreenView", MainLauncher = true)]
        public class SplashScreenView : MvxSplashScreenActivity
        {
            protected override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
                SetContentView(Resource.Layout.SplashScreenPage);
            }
        }
    }
    • 添加一个主窗口布局:
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:minWidth="25px"
        android:minHeight="25px">
        <TextView
            android:text="我是主窗口"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/textView1"
            android:layout_centerInParent="true"
            android:textColor="@android:color/holo_orange_light" />
    </RelativeLayout>
    • 添加主窗口Acvivity:
    using Android.App;
    using Android.OS;
    using MvvmCross.Droid.Views;
    using MvxSample.ViewModels;
    
    namespace MvxSample.Droid.Views
    {
        [Activity(Label = "MainView", MainLauncher = false)]
        public class MainView : MvxActivity<MainViewModel>
        {
            protected override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);
    
                SetContentView(Resource.Layout.MainPage);
    
                // Create your application here
            }
        }
    }

    ok,到这里,我们的启动界面已经完成了,运行一下看看效果:

    demo1

    看起来效果还不错,达到了我们的目的。等等,启动时为什么不是先出现启动界面,而是先出现了一个白屏,这是什么鬼?

    这是因为在系统加载App时,窗口显示布局还没有加载,所以会出现短暂的白屏。那我们就先给窗口一个样式,样式会跟随窗口一起创建,这样就不会只显示白屏了Smile

    • 我们先增加一个Resource:
    <?xml version="1.0" encoding="utf-8"?>
    
    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
      <item>
        <layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
      <!-- 设置整个屏幕背景为白色 -->
      <item >
        <color android:color="@android:color/white"/>
      </item>
      <item>
        <!--显示一个图片在底部-->
        <bitmap
            android:layout_width="match_parent"
            android:gravity="bottom|center_horizontal|fill_horizontal"
            android:src="@drawable/phoenixtitle" />
      </item>
    
    </layer-list>
      </item>
    </selector>
    
    
    
    • 再增加一个系统样式:
    <?xml version="1.0" encoding="utf-8" ?>
    <resources xmlns:android="http://schemas.android.com/apk/res/android">
      <style name="AppSplash" parent="android:Theme">
        <item name="android:windowBackground">@drawable/splashlayerlist</item>
        <item name="android:windowNoTitle">true</item>
      </style>
    </resources>

    最后,我们将启动窗口的样式设置为新建的样式:

    using Android.App;
    using Android.OS;
    using MvvmCross.Droid.Views;
    
    namespace MvxSample.Droid.Views
    {
        [Activity(Label = "MvxTest", NoHistory =true, MainLauncher = true, Theme = "@style/AppSplash")]
        public class SplashScreenView : MvxSplashScreenActivity
        {
            public SplashScreenView() : base(Resource.Layout.SplashScreenPage)
            {
            }
    
        }
    }

    大功告成,让我们再看看效果:

    demo2

    我们看到当App启动时,当SplashScreen还没有出现时,先加载了样式,然后才显示出SplashScreen,随后显示主窗口。这样就不会一直显示白屏。

    小结

    本篇主要讲解了如何通过MvvmCorss显示SplashScreen,以及如何处理App启动时白屏的处理。

    下次我们讲解一下Fragment在MvvmCross中如何使用的。

    最好,代码奉上,看这里

  • 相关阅读:
    安卓学习12
    安卓学习11
    安卓学习10
    安卓学习9
    Python3之json&pickle模块
    Mysql之基础sql语句
    Django模型层之单表操作
    创建Django项目与应用的两个命令
    windows命令行切换目录
    Django视图层之请求对象(request)和响应对象(HttpResponse)
  • 原文地址:https://www.cnblogs.com/phoenixdong/p/6591966.html
Copyright © 2011-2022 走看看