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中如何使用的。

    最好,代码奉上,看这里

  • 相关阅读:
    Zabbix5 Frame 嵌套
    Zabbix5 对接 SAML 协议 SSO
    CentOS7 安装 Nexus
    CentOS7 安装 SonarQube
    GitLab 后台修改用户密码
    GitLab 查看版本号
    GitLab Admin Area 500 Error
    Linux 安装 PostgreSQL
    Liger ui grid 参数
    vue.js 是一个怪东西
  • 原文地址:https://www.cnblogs.com/phoenixdong/p/6591966.html
Copyright © 2011-2022 走看看