【问题标题】:Android - Disable dummy starting window of applicationAndroid - 禁用应用程序的虚拟启动窗口
【发布时间】:2013-05-31 03:34:34
【问题描述】:

我想知道如何实现这个效果。

我的应用程序(默认一切),当单击启动器图标时,会立即显示某种空的虚拟窗口,其中什么都没有发生,然后将布局加载到其中。

YouTube、Drive、Dropbox 等“较重”的应用在启动时似乎会在启动后等待,而不会显示该虚拟窗口并直接加载到就绪布局中。

知道如何执行此操作或我应该在哪里查看?

谢谢

//编辑:这与加载数据库之类的东西无关,我应该在其中显示进度条,恕我直言,这与活动存在之前的东西有关。

【问题讨论】:

    标签: android window startup


    【解决方案1】:

    我建议您不要使用以下方法禁用虚拟加载窗口:

    <style name="Theme.MyTheme" parent="android:style/Theme" >
        ....
        <item name="android:windowDisablePreview">true</item>
        ....
    </style>
    

    因为您可能会遇到几个问题。例如,如果您尝试为 AlertDialog 设置动画,则输入动画将不起作用(个人经验)。

    正确的解决方案是将您的应用程序的主题设置为您的主活动屏幕(相同的 ActionBar 样式,相同的背景颜色)。 在我经过多次实验后的应用中,我找到了适合我需求的解决方案。 (我有一个空白背景的主要活动,没有 ActionBar,只是全屏个人布局)

    1 - styles.xml:像这样添加新样式(删除 ActionBar 并设置与我的主要活动相同的背景颜色)

    <style name="LoadingTheme" parent="@android:style/Theme.Light.NoTitleBar.Fullscreen">
        <item name="android:windowBackground">@color/white_smoke</item>
    </style>
    

    2 - AndroidManifest.xml:将我的主活动主题设置为“LoadingTheme”

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
            <activity
                android:name="com.company.appname.MainActivity"
                android:label="@string/app_name"
                android:theme="@style/LoadingTheme">
            <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
        </activity>
        ....
    </application>
    

    最后我有一个完全空白的虚拟加载窗口,没有带有软 MainActivity 加载和工作动画的 ActionBar。

    希望对您有所帮助。

    【讨论】:

    • @JDCoder 我同意你不使用 android:windowDisablePreview=true 但我有一个问题。我在蓝色背景中有一个闪屏,用户可以将其更改为橙色作为主题偏好。当它是蓝色的,然后在应用程序启动时更改为橙色主题,而不是在预览窗口中显示橙色,它首先显示蓝色一会儿,然后更改为橙色样式。我该如何解决这个问题?
    【解决方案2】:

    这将为您的活动创建一个自定义预览窗口。

    在styles.xml中创建一个样式

    <style name="MyTheme" parent="@android:style/Theme.Holo.NoActionBar">
        <item name="android:windowBackground">@color/myBackgroundColor</item>
    </style>
    

    在您的清单文件中使用上面创建的主题。 例如:

    <activity android:name=".MyActivity"
       android:label="@string/app_name"
       android:theme="@style/MyTheme"
       />
    

    在您的活动中,将 onCreate() 中的窗口背景更改回 null

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setBackgroundDrawable(null);
        setContentView(R.layout.main);
    }
    

    【讨论】:

    • 只有这个解决方案对我有用。但是我已经应用了可绘制 - 使用单个 item : drawable = @ color 而不是 null
    【解决方案3】:
    <style name="Theme.MyTheme" parent="android:style/Theme" >
        ....
        <item name="android:windowDisablePreview">true</item>
        ....
    </style>
    

    但谨慎使用

    【讨论】:

    • 但是,与不抑制预览窗口的应用程序相比,这种方法可能会导致更长的启动时间。此外,它会迫使用户在活动启动时等待没有反馈,让他们怀疑应用程序是否正常运行。参考这个链接developer.android.com/topic/performance/vitals/launch-time
    【解决方案4】:

    在设置内容视图之前加载您的资源。在您不使用 setContentView 设置视图之前,将会有一个虚拟窗口。

    编辑 避免出现这个画面。对您的代码进行更改。

    1) 不要在活动 onCreate 方法中做任何繁重的工作。为它运行一个单独的线程。

    2) 在 super.onCreate() 行之后设置内容视图

       super.onCreate(savedInstanceState);
       setContentView (R.layout.splash_screen);
    

    3) 将以下主题应用于您的应用程序。

    在样式中定义主题

    <resources>
    <style name="Theme.MyTheme" parent="android:style/Theme" >
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowBackground">@drawable/any_default_background</item>
    
    </style>
    </resources>
    

    在您的清单中

          <application
            ....
    
            android:theme="@style/Theme.MyTheme"
            ....
             > 
    

    就是这样。

    【讨论】:

    • 这对我来说没有任何意义。我应该在 setContentView() 之前加载资源,并且在 setContentView 未设置之前将显示虚拟窗口,对吗?我不想要那个虚拟窗口。
    • 那么让用户等待应用程序而不显示任何启动屏幕不是一个好的应用程序行为。在后台加载资源时,您应该显示一些启动画面。
    • 它只有一两秒,但在我看来,那个空白窗口给出了糟糕的用户体验,所以我想跳过它。谷歌应用程序也这样做(Gmail 显示虚拟窗口,驱动器没有 - 检查它)/当我加载数据库时,我当然显示进度条,但在我看来,我正在等待所有静态资源等,而不是活动。
    • 你是对的。我只是注意到这一点。我不确定,但改变活动启动方式可能会有效。
    • 是的,Google Goggles 和 Evernote 也是如此,我没有编造它:-D
    【解决方案5】:

    您可以在活动中的任何位置调用setContentView 方法。在调用此方法之前,它将显示一个空白屏幕。如果你想要一个闪屏,你可以在onCreate 方法中调用setContentView 方法来显示闪屏视图。然后,当您准备好显示“主”视图时,您可以使用LayoutInflater 来显示它。我还建议使用ProgressDialog 向用户显示正在加载信息。

    【讨论】:

    • 问题是,我的应用程序有很多静态资源等,所以我猜这些是在活动存在之前加载的,所以这就是为什么那个空白窗口。然后在活动中我有游标加载器,我正在显示 ProgressBar,它只是闪烁,因为数据库不是那么大。 .. 我想要避免的是第一个虚拟窗口,没有启动屏幕,就像那些提到的应用程序那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多