Cách khắc phục màn hình trắng trên ứng dụng Khởi động?


111

Tôi có một ứng dụng Android hiển thị màn hình trắng trong 2 giây khi khởi động. Các ứng dụng khác của tôi không làm được điều này, nhưng ứng dụng này thì có. Tôi cũng đã triển khai một màn hình giật gân với hy vọng rằng nó sẽ khắc phục được điều này. Tôi có nên tăng thời gian ngủ trên màn hình giật gân không? Cảm ơn.


1
Hoạt động mà bạn đang bắt đầu mất quá nhiều thời gian để thực hiện onCreatephần việc của nó . Cố gắng chỉ "setContentView" trong hoạt động đó và kiểm tra xem sự chậm trễ này đã biến mất chưa.
Sherif elKhatib 12/1213

1
xin lỗi tôi là một người mới và tôi không có kinh nghiệm với java, bạn có thể vui lòng giải thích rõ ràng? và vui lòng đưa ra một "câu trả lời" để tôi có thể đánh dấu vào nó :)
Anonymous

1
Bạn đang sử dụng java hay c # trong dự án của mình?
Sherif elKhatib 12/1213

1
Hy vọng liên kết này sẽ giúp ích cho bạn: cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Mikalai Daronin

Câu trả lời:


104

Chỉ cần đề cập đến chủ đề trong suốt cho hoạt động bắt đầu trong tệp AndroidManifest.xml.

Giống:

<activity
        android:name="first Activity Name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
 </activity>

và mở rộng màn hình đó với Activitylớp thay cho AppCompatActivity.

giống :

public class SplashScreenActivity extends Activity{

  ----YOUR CODE GOES HERE----
}

4
nhưng sử dụng final ActionBar actionBar = getActionBar();sẽ trả về null khi Theme là mờ
Có người Một nơi nào đó

16
Pankaj - vâng, tôi biết được rằng trải nghiệm giao diện người dùng tồi là do cửa sổ "xem trước" ... rõ ràng ai đó tại Google đã quyết định rằng cửa sổ xem trước màu trắng thực sự tuyệt vời khi sử dụng theo mặc định. Tuy nhiên, trong một ứng dụng sử dụng nền tối, đó là một ý tưởng thực sự tồi. Giải pháp là tạo kiểu tùy chỉnh cho ứng dụng của bạn và chỉ định 'android: windowBackground' cho màu bạn muốn sử dụng. Xem phần "cửa sổ xem trước hoàn hảo" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Ai đó ở đâu đó

2
@Hagai L Nó cho tôi một lỗi như "java.lang.IllegalStateException: Bạn cần sử dụng chủ đề Theme.AppCompat (hoặc hậu duệ) với hoạt động này."
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" không hoạt động với tôi, bất kỳ đề xuất nào?
jay

1
@TejaDroid gặp lỗi dừng "java.lang.IllegalStateException", bạn phải mở rộng Activity của mình bằng android.app.Activity, ngay bây giờ bạn đang sử dụng AppCompactActivity. Vì vậy, đối với AppCompactActivity, bạn không thể sử dụng các chủ đề bình thường.
Sẵn sàng cho Android

167

Đặt nó trong một phong cách tùy chỉnh và nó giải quyết tất cả các vấn đề. Sử dụng bản sửa lỗi mờ hacky sẽ làm cho thanh tác vụ và thanh điều hướng của bạn trong mờ và làm cho màn hình giật gân hoặc màn hình chính trông giống như mì Ý.

<item name="android:windowDisablePreview">true</item>


3
Thx người đàn ông, được cứu khỏi rất nhiều rắc rối. Tôi đã gặp khó khăn ban đầu để có được điểm thiết lập. Nó sẽ là khối chủ đề chính: inline `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> true </item>` phải là điểm nhập ở kiểu chính .xml
HumaN

2
Cám ơn! Đặt nó để style.xml trong res thư mục vào phong cách tên thẻ = "AppTheme" (hoặc những gì chủ đề bạn sử dụng trong manifest)
Dimmduh

Đã làm cho tôi. Cảm ơn bạn.
user1510006 13/02/17

Tôi nghĩ rằng nó phải là câu trả lời được chấp nhận, bởi vì rất nhiều nhà phát triển sử dụng theme tùy biến
Sviatoslav Zaitsev

siêu hữu ích :)
jasan

74

nhập mô tả hình ảnh ở đây

Giống như bạn ống .. ban đầu họ hiển thị màn hình biểu tượng thay vì màn hình trắng. Và sau 2 giây hiển thị màn hình chính.

trước tiên hãy tạo một XML có thể vẽ được trong res / drawable.

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@color/gray"/>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

Tiếp theo, bạn sẽ đặt nó làm nền cho hoạt động giật gân của mình trong chủ đề. Điều hướng đến tệp styles.xml của bạn và thêm chủ đề mới cho hoạt động giật gân của bạn

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
    </style>

</resources>

Trong SplashTheme mới của bạn, hãy đặt thuộc tính nền cửa sổ thành XML có thể vẽ của bạn. Định cấu hình đây làm chủ đề hoạt động giật gân của bạn trong AndroidManifest.xml:

<activity
    android:name=".SplashActivity"
    android:theme="@style/SplashTheme">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />

        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Liên kết này cung cấp những gì bạn muốn. từng bước thủ tục. https://www.bignerdranch.com/blog/splash-screens-the-right-way/

CẬP NHẬT:

Các layer-listcó thể còn đơn giản hơn như thế này (mà cũng chấp nhận drawables vector cho logo làm trung tâm, không giống như các <bitmap>thẻ):

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Background color -->
    <item android:drawable="@color/gray"/>

    <!-- Logo at the center of the screen -->
    <item
        android:drawable="@mipmap/ic_launcher"
        android:gravity="center"/>
</layer-list>

1
Đây là thực sự tuyệt vời, nhưng làm thế nào tôi có thể thêm văn bản dướimipmap/ic_launcher
Hasan Một Yousef

6
Đây là câu trả lời tốt nhất. Lý do là khi sử dụng các giải pháp trên, có sự chậm trễ trong quá trình khởi động trực quan của ứng dụng.
Jnr

một bản sửa lỗi nữa để kiểm soát bitmap stackoverflow.com/questions/23079355/…
amorenew

1
Đây phải là câu trả lời được chấp nhận, tất cả các câu trả lời khác chỉ làm cho nó trông giống như ứng dụng chưa bao giờ được khởi chạy theo quan điểm của người dùng. Một layer-listcó thể vẽ đơn giản hơn có thể là thế này: <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- Background color --> <item android:drawable="@color/white"/> <!-- Logo at the center of the screen --> <item android:drawable="@mipmap/ic_launcher" android:gravity="center"/> </layer-list>
Franco

Giải pháp này không giải quyết được vấn đề khi chúng tôi muốn thay đổi màu nền trong danh sách lớp theo chương trình (trong ví dụ của bạn từ màu xám, ví dụ sang màu xanh lam). Trong trường hợp này, màn hình màu xám đầu tiên xuất hiện trong một hoặc hai giây, sau đó nền màu xanh lam được thiết lập!
Mohammad Afrashteh

71

Tạo phong cách trong bạn style.xml như sau:

<style name="Theme.Transparent" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

và sử dụng nó với hoạt động của bạn trong AndroidManifest như:

<activity android:name=".ActivitySplash" android:theme="@style/Theme.Transparent">

8

Bạn nên đọc bài đăng tuyệt vời này của Cyril Mottier: Khởi chạy ứng dụng Android trở nên tuyệt đẹp

Bạn cần tùy chỉnh Themetrong style.xml của mình và tránh tùy chỉnh trong ActionBar.setIcon onCreate/ setTitle / etc của bạn.

Xem thêm Tài liệu về Mẹo Hiệu suất của Google.

Sử dụng Trace ViewHierarchy Viewerđể xem thời gian hiển thị Chế độ xem của bạn: Tối ưu hóa hiệu suất Android / Điều chỉnh hiệu suất trên Android

Sử dụng AsyncTaskđể hiển thị một số chế độ xem.


6

Đây là AppTheme của tôi trên một ứng dụng ví dụ:

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="android:windowIsTranslucent">true</item>
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

Như bạn có thể thấy, tôi có các màu mặc định và sau đó tôi thêm android:windowIsTranslucentvà đặt nó thành true.

Theo như tôi biết với tư cách là Nhà phát triển Android, đây là điều duy nhất bạn cần thiết lập để ẩn màn hình trắng khi bắt đầu ứng dụng.


4

Cả hai thuộc tính hoạt động sử dụng bất kỳ một trong số chúng.

    <style name="AppBaseThemeDark" parent="@style/Theme.AppCompat">
            <!--your other properties -->
            <!--<item name="android:windowDisablePreview">true</item>-->
            <item name="android:windowBackground">@null</item>
            <!--your other properties -->
    </style>

4

Các câu trả lời user543 là hoàn hảo

<activity
        android:name="first Activity Name"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
 </activity>

Nhưng:

Bạn là người khởi chạy Activity phải mở rộng Activity chứ không phải AppCompatActivity như mặc định!


Tôi đã thử giải pháp này nhiều lần vì mọi nơi đều viết cùng một giải pháp này, nó không hoạt động được -> nhưng bạn NHƯNG tiết kiệm thời gian của tôi Hoạt động của tôi mở rộng AppCompatActivity đó là lý do tại sao nó không hoạt động. Tôi đã thay đổi nó thành hoạt động bây giờ nó hoạt động cảm ơn bạn !!
Rucha Bhatt Joshi

4

Nền trắng đến từ Apptheme.Bạn có thể hiển thị thứ gì đó hữu ích như logo ứng dụng của bạn thay vì màn hình trắng. Bạn có thể thực hiện điều này bằng cách sử dụng chủ đề tùy chỉnh. Trong ứng dụng Chủ đề của bạn chỉ cần thêm

android:windowBackground=""

thuộc tính. Giá trị thuộc tính có thể là hình ảnh hoặc danh sách nhiều lớp hoặc bất kỳ màu nào.


Điều này hoạt động, Tốt hơn nếu bạn đặt màu trong suốt cho cửa sổ. <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

Đây phải là câu trả lời được chấp nhận. Dù sao thì bạn có biết cách thêm hoạt ảnh của ứng dụng chia tỷ lệ như youtube.
pratham kesarkar

Thay vì màu trắng bây giờ nó là màu đen.
Ümañg ßürmån

2

Dưới đây là liên kết gợi ý cách thiết kế màn hình Splash. Để tránh nền trắng / đen, chúng ta cần xác định chủ đề với nền giật gân và đặt chủ đề đó thành nền giật gân trong tệp kê khai.

https://android.jlelse.eu/right-way-to-create-splash-screen-on-android-e7f1709ba154

splash_background.xml bên trong thư mục res / drawable

<?xml version=”1.0" encoding=”utf-8"?>
 <layer-list xmlns:android=”http://schemas.android.com/apk/res/android">

 <item android:drawable=”@color/colorPrimary” />

 <item>
 <bitmap
 android:gravity=”center”
 android:src=”@mipmap/ic_launcher” />
 </item>

</layer-list>

Thêm kiểu bên dưới

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>
    <!-- Splash Screen theme. -->
    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/splash_background</item>
    </style>

Trong chủ đề bộ Tệp kê khai như hình dưới đây

<activity
            android:name=".SplashActivity"
            android:theme="@style/SplashTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </activity>

2

tôi cũng gặp vấn đề tương tự trong một dự án của mình. Tôi đã giải quyết nó bằng cách thêm một số thông số sau trong chủ đề được cung cấp cho màn hình giật gân.

<item name="android:windowFullscreen">true</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowIsTranslucent">true</item>

Bạn có thể tìm thấy lý do và cách giải quyết trong bài đăng blog này do tôi viết. Hy vọng nó giúp.


Vui lòng thêm các chi tiết trực tiếp vào câu trả lời của bạn. Các liên kết có thể trở nên không hợp lệ, đó là lý do tại sao chúng tôi muốn câu trả lời chứa nội dung thực tế, liên kết chỉ là bổ sung.
OOBalance

1

Nó có thể được khắc phục bằng cách đặt chủ đề trong tệp kê khai của bạn là

<activity
        android:name=".MySplashActivityName"
        android:theme="@android:style/Theme.Translucent.NoTitleBar" >
 <intent-filter>
     <action android:name="android.intent.action.MAIN" />
     <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

và sau đó nếu bạn nhận được
java.lang.IllegalStateException: Bạn cần sử dụng chủ đề Theme.AppCompat (hoặc hậu duệ) với hoạt động này.
thì bạn có thể cần phải mở rộng Activity thay vì AppCompatActivity trong MySplashActivity của mình.

Hy vọng nó giúp!


1

Nền trắng là do Android khởi động trong khi ứng dụng tải trên bộ nhớ và nó có thể tránh được nếu bạn chỉ cần thêm 2 dòng mã này dưới SplashTheme.

<item name="android:windowDisablePreview">true</item>
<item name="android:windowIsTranslucent">true</item>

0

bạn nên tắt Cài đặt studio android Instant Run.

Tệp> Cài đặt> Xây dựng, Thực thi, Triển khai> Chạy tức thì bỏ chọn tất cả các tùy chọn hiển thị ở đó.

Lưu ý: Sự cố màn hình trắng do Chạy tức thì chỉ dành cho các bản dựng Gỡ lỗi, Sự cố này sẽ không xuất hiện trên các bản phát hành.


0

Hãy thử mã sau:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="android:windowNoTitle">true</item>
    <item name="android:windowActionBar">false</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowContentOverlay">@null</item>
    <item name="android:windowIsTranslucent">true</item>
</style>

Mã này phù hợp với tôi và sẽ hoạt động trên tất cả các thiết bị Android.


Câu trả lời chỉ có mã không được khuyến khích. Vui lòng nhấp vào chỉnh sửa và thêm một số từ tóm tắt cách mã của bạn giải quyết câu hỏi hoặc có thể giải thích câu trả lời của bạn khác với câu trả lời / câu trả lời trước đó như thế nào. Từ đánh giá
Nick

0

Giải pháp của nó là rất đơn giản!

ba lý do cơ bản cho vấn đề này

  1. Bạn đang thực hiện tác vụ nặng / chạy lâu / phức tạp trong Hàm onCreateVeiw.
  2. Nếu bạn đang sử dụng Thread. Khi đó thời gian Ngủ của Chủ đề có thể rất lớn.
  3. Nếu Bạn đang sử dụng bất kỳ thư viện Bên thứ ba nào . Đó là khởi tạo tại ứng dụng khởi động thời gian nó có thể dẫn vấn đề này.

Các giải pháp:

Giải pháp 1:

  Remove the Heavy Task from onCreateView() function and place it some where appropriate place.

Giải pháp 2:

  Reduce the Thread Sleep time.

Giải pháp 3:

  Remove the Third party library at app initialize at implement them with some good strategy.

Trong trường hợp của tôi, tôi đang sử dụng Sugar ORM dẫn đến vấn đề này.

Chia sẻ để cải thiện.


0

Điều này đã giải quyết vấn đề:

Chỉnh sửa tệp styles.xml của bạn:


Dán mã bên dưới:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowIsTranslucent">true</item>
    </style>

</resources>

Và đừng quên thực hiện các sửa đổi trong tệp AndroidManifest.xml . ( tên chủ đề )

Hãy cẩn thận về thứ tự khai báo của các hoạt động trong tệp này.


0
I encountered a similar problem and to overcome it, I implemented the code below in styles, i.e res->values->styles->resource tag 
<item name="android:windowDisablePreview">true</item>

Here is the whole code:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowDisablePreview">true</item>
</style>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.