วิธีแก้ไขหน้าจอสีขาวบนแอพเริ่มต้นขึ้น


111

ฉันมีแอพ Android ที่แสดงหน้าจอสีขาวเป็นเวลา 2 วินาทีเมื่อเริ่มต้น แอปอื่น ๆ ของฉันไม่ทำ แต่แอปนี้ทำ ฉันยังติดตั้ง Splashscreen ด้วยหวังว่ามันจะแก้ไขปัญหานี้ได้ ฉันควรเพิ่มเวลาพักหน้าจอสแปลชหรือไม่? ขอบคุณ


1
กิจกรรมที่คุณจะเริ่มต้นใช้เวลานานเกินไปที่จะทำมันonCreateเป็นส่วนหนึ่ง ลองแค่ "setContentView" ในกิจกรรมนั้นและตรวจสอบว่าความล่าช้านี้หายไปหรือไม่
Sherif elKhatib

1
ขออภัยฉันเป็นมือใหม่และฉันไม่มีประสบการณ์กับ java คุณช่วยอธิบายให้ชัดเจนได้ไหม และโปรดให้ "คำตอบ" เพื่อที่ฉันจะได้ติ๊ก :)
ไม่ระบุชื่อ

1
คุณใช้ java หรือc #ในโปรเจ็กต์ของคุณหรือไม่?
Sherif elKhatib

1
หวังว่าลิงค์นี้จะช่วยคุณได้: cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Mikalai Daronin

geeksforandroidgeeks.com/android/splash_issueกรุณาไปที่ลิงค์
Vivek Kumar Samele

คำตอบ:


104

เพียงพูดถึงธีมโปร่งใสในกิจกรรมเริ่มต้นในไฟล์ AndroidManifest.xml

ชอบ:

<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>

และขยายหน้าจอที่มีระดับในสถานที่ของActivityAppCompatActivity

ชอบ :

public class SplashScreenActivity extends Activity{

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

4
แต่การใช้final ActionBar actionBar = getActionBar();จะคืนค่าว่างเมื่อธีมโปร่งแสง
ใครบางคนอยู่ที่ไหนสักแห่ง

17
Pankaj - ใช่ฉันเรียนรู้ว่าประสบการณ์ UI ที่ไม่ดีเกิดจากหน้าต่าง "ดูตัวอย่าง" ... เห็นได้ชัดว่ามีคนที่ Google ตัดสินใจว่าหน้าต่างแสดงตัวอย่างสีขาวนั้นยอดเยี่ยมมากที่จะใช้โดยค่าเริ่มต้น อย่างไรก็ตามในแอปที่ใช้พื้นหลังสีเข้มมันเป็นความคิดที่แย่มาก วิธีแก้ปัญหาคือสร้างสไตล์ที่กำหนดเองสำหรับแอปของคุณและระบุ 'android: windowBackground' เป็นสีที่คุณต้องการใช้ ดูส่วน "หน้าต่างแสดงตัวอย่างที่สมบูรณ์แบบ" cyrilmottier.com/2013/01/23/android-app-launching-made-gorgeous
Someone Somewhere

2
@Hagai L มันทำให้ฉันมีข้อผิดพลาดเช่น "java.lang.IllegalStateException: คุณต้องใช้ธีม Theme.AppCompat (หรือลูกหลาน) กับกิจกรรมนี้"
TejaDroid

1
android: theme = "@ android: style / Theme.Translucent.NoTitleBar" ไม่ได้ผลสำหรับฉันข้อเสนอแนะใด ๆ ?
เจ

1
@TejaDroid เพื่อรับข้อผิดพลาดหยุด "java.lang.IllegalStateException" คุณต้องขยายกิจกรรมของคุณโดย android.app.Activity ตอนนี้คุณกำลังใช้ AppCompactActivity ดังนั้นสำหรับ AppCompactActivity คุณไม่สามารถใช้ธีมปกติได้
พร้อม Android

167

ใส่สิ่งนี้ในสไตล์ที่กำหนดเองและจะช่วยแก้ปัญหาทั้งหมดได้ การใช้การแก้ไขแบบโปร่งแสงแบบแฮ็กจะทำให้แถบงานและแถบนำทางของคุณโปร่งแสงและทำให้หน้าจอเริ่มต้นหรือหน้าจอหลักดูเหมือนสปาเก็ตตี้

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


3
ขอบคุณคนช่วยจากความยุ่งยากมากมาย ตอนแรกฉันมีช่วงเวลาที่ยากลำบากในการหาจุดตั้งค่า จะเป็นบล็อกธีมหลัก: อินไลน์ `<style name =" AppTheme "parent =" Theme.AppCompat.NoActionBar "> <item name =" android: windowDisablePreview "> จริง </item>` ควรเป็นจุดเริ่มต้นที่สไตล์หลัก .xml
HumaN

2
ขอบคุณ! ใส่ไว้ใน style.xml ในโฟลเดอร์ res ลงใน style tag name = "AppTheme" (หรือธีมที่คุณใช้ในรายการ)
Dimmduh

ทำงานให้ฉัน ขอบคุณ.
user1510006

ฉันคิดว่ามันควรได้รับคำตอบเพราะผู้พัฒนาจำนวนมากใช้ธีมที่กำหนดเอง
Sviatoslav Zaitsev

สุดยอดประโยชน์ :)
jasan

74

ใส่คำอธิบายภาพที่นี่

เหมือนคุณหลอด .. ตอนแรกพวกเขาจะแสดงหน้าจอไอคอนแทนหน้าจอสีขาว และหลังจากนั้น 2 วินาทีจะแสดงหน้าจอหลัก

ก่อนอื่นให้สร้าง XML ที่วาดได้ใน 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>

จากนั้นคุณจะตั้งค่านี้เป็นพื้นหลังของกิจกรรมสแปลชในธีม ไปที่ไฟล์ styles.xml ของคุณและเพิ่มธีมใหม่สำหรับกิจกรรมสแปลชของคุณ

<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>

ใน SplashTheme ใหม่ของคุณตั้งค่าแอตทริบิวต์พื้นหลังหน้าต่างเป็น XML ที่วาดได้ กำหนดค่าสิ่งนี้เป็นธีมของกิจกรรม Splash ใน 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>

ลิงค์นี้ให้สิ่งที่คุณต้องการ ขั้นตอนทีละขั้นตอน https://www.bignerdranch.com/blog/splash-screens-the-right-way/

UPDATE:

layer-listสามารถเป็นได้ง่ายเช่นนี้ (ซึ่งยังยอมรับภาพวาดเวกเตอร์โลโก้ศูนย์กลางซึ่งแตกต่างจาก<bitmap>แท็ก):

<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
นี่เป็นเรื่องที่ดีมาก แต่ฉันจะเพิ่มข้อความในmipmap/ic_launcher
Hasan A Yousef

6
นี่คือคำตอบที่ดีที่สุด เหตุผลก็คือเมื่อใช้วิธีแก้ไขปัญหาข้างต้นมีความล่าช้าในการเริ่มต้นแอปด้วยภาพ
Jnr

อีกหนึ่งการแก้ไขเพื่อควบคุม bitmap stackoverflow.com/questions/23079355/…
amorenew

1
นี่ควรเป็นคำตอบที่ได้รับการยอมรับคนอื่น ๆ ทั้งหมดทำให้ดูเหมือนว่าแอปไม่เคยเริ่มต้นจากมุมมองของผู้ใช้ วาดได้ง่ายกว่าlayer-listนี้: <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

วิธีนี้ไม่สามารถแก้ปัญหาได้เมื่อเราต้องการเปลี่ยนสีพื้นหลังในรายการเลเยอร์โดยทางโปรแกรม (ในตัวอย่างของคุณจากสีเทาเช่นสีน้ำเงิน) ในสถานการณ์นี้หน้าจอสีเทาแรกจะปรากฏขึ้นเป็นเวลาหนึ่งหรือสองวินาทีจากนั้นพื้นหลังสีน้ำเงินจะถูกตั้งค่า!
Mohammad Afrashteh

71

สร้างสไตล์ในคุณ style.xml ดังนี้:

<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>

และใช้กับกิจกรรมของคุณใน AndroidManifest เป็น:

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

8

คุณควรอ่านโพสต์ที่ยอดเยี่ยมนี้โดย Cyril Mottier: การเปิดตัวแอพ Android ที่สวยงาม

คุณต้องปรับแต่งThemeใน style.xml ของคุณและหลีกเลี่ยงการปรับแต่งในแบบonCreateActionBar.setIcon / setTitle / etc

ดูเอกสารเกี่ยวกับเคล็ดลับประสิทธิภาพโดย Google

ใช้Trace ViewและHierarchy Viewerเพื่อดูเวลาในการแสดงมุมมองของคุณ: การเพิ่มประสิทธิภาพ Android / การปรับแต่งประสิทธิภาพบน Android

ใช้AsyncTaskเพื่อแสดงบางมุมมอง


6

นี่คือ AppTheme ของฉันในแอปตัวอย่าง:

<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>

ที่คุณสามารถดูผมมีสีที่เริ่มต้นและจากนั้นฉันเพิ่มและตั้งค่าให้android:windowIsTranslucenttrue

เท่าที่ฉันรู้ในฐานะนักพัฒนา Android นี่เป็นสิ่งเดียวที่คุณต้องตั้งค่าเพื่อซ่อนหน้าจอสีขาวเมื่อเริ่มแอปพลิเคชัน


4

คุณสมบัติทั้งสองใช้งานอย่างใดอย่างหนึ่ง

    <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

คำตอบ user543เป็นที่สมบูรณ์แบบ

<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>

แต่:

you'r กิจกรรมยิงต้อง extands กิจกรรมไม่AppCompatActivityมันก็เป็นค่าเริ่มต้น!


ฉันลองใช้วิธีแก้ปัญหานี้หลายครั้งเนื่องจากทุกที่เขียนวิธีแก้ปัญหาเดียวกันนี้ใช้งานไม่ได้ -> แต่ของคุณประหยัดเวลาของฉันกิจกรรมของฉันขยาย AppCompatActivity นั่นเป็นเหตุผลว่าทำไมมันถึงใช้งานไม่ได้ฉันเปลี่ยนเป็นกิจกรรมตอนนี้มันใช้งานได้ขอบคุณ!
Rucha Bhatt Joshi

4

พื้นหลังสีขาวมาจาก Apptheme คุณสามารถแสดงสิ่งที่มีประโยชน์เช่นโลโก้แอปพลิเคชันของคุณแทนที่จะเป็นหน้าจอสีขาวสามารถทำได้โดยใช้ธีมที่กำหนดเองในแอปธีมของคุณเพียงแค่เพิ่ม

android:windowBackground=""

คุณลักษณะ ค่าแอตทริบิวต์อาจเป็นรูปภาพหรือรายการแบบเลเยอร์หรือสีใดก็ได้


วิธีนี้ใช้ได้ผลดีกว่าถ้าคุณตั้งค่าสีโปร่งใสเป็นหน้าต่าง <item name="android:windowBackground">@android:color/transparent</item>
Amol Desai

นี่ควรเป็นคำตอบที่ได้รับการยอมรับ อย่างไรก็ตามคุณรู้วิธีเพิ่มภาพเคลื่อนไหวของการปรับขนาดเช่นแอป youtube
pratham kesarkar

แทนที่จะเป็นสีขาวตอนนี้เป็นสีดำ
Ümañgßürmån

2

ด้านล่างนี้เป็นลิงค์ที่แนะนำวิธีการออกแบบหน้าจอ Splash เพื่อหลีกเลี่ยงพื้นหลังสีขาว / ดำเราจำเป็นต้องกำหนดธีมที่มีพื้นหลังสแปลชและตั้งค่าชุดรูปแบบนั้นให้สาดในไฟล์รายการ

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

splash_background.xml ภายในโฟลเดอร์ 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>

เพิ่มรูปแบบด้านล่าง

<!-- 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>

ใน Manifest set theme ดังแสดงด้านล่าง

<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

ฉันมีปัญหาเดียวกันในโครงการหนึ่งของฉัน ฉันแก้ไขได้โดยเพิ่มพารามิเตอร์ต่อไปนี้ในชุดรูปแบบที่มีให้ในหน้าจอเริ่มต้น

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

คุณสามารถค้นหาเหตุผลและความละเอียดได้ในโพสต์บล็อกนี้ที่เขียนโดยฉัน หวังว่าจะช่วยได้


โปรดเพิ่มรายละเอียดโดยตรงในคำตอบของคุณ ลิงก์อาจไม่ถูกต้องนั่นเป็นเหตุผลที่เราต้องการให้คำตอบมีเนื้อหาจริงลิงก์เป็นเพียงส่วนเสริมเท่านั้น
OOBalance

1

สามารถแก้ไขได้โดยตั้งค่าธีมในรายการของคุณเป็น

<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>

และหลังจากนั้นหากคุณได้รับ
java.lang.IllegalStateException: คุณต้องใช้ธีม Theme.AppCompat (หรือลูกหลาน) กับกิจกรรมนี้
จากนั้นคุณอาจต้องขยายกิจกรรมแทนAppCompatActivityใน MySplashActivity ของคุณ

หวังว่าจะช่วยได้!


1

พื้นหลังสีขาวเกิดขึ้นเนื่องจาก Android เริ่มทำงานในขณะที่แอปโหลดในหน่วยความจำและสามารถหลีกเลี่ยงได้หากคุณเพิ่มโค้ด 2 บรรทัดนี้ใน SplashTheme

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

0

คุณควรปิดการใช้งาน Instant Run android studio Settings

File> Settings> Build, Execution, Deployment> Instant Run unCheck all options ที่แสดงในนั้น

หมายเหตุ:ปัญหาหน้าจอสีขาวเนื่องจากการเรียกใช้ทันทีมีไว้สำหรับรุ่นดีบักเท่านั้นปัญหานี้จะไม่ปรากฏในรุ่นรุ่น


0

ลองใช้รหัสต่อไปนี้:

<!-- 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>

รหัสนี้ใช้ได้สำหรับฉันและจะใช้ได้กับอุปกรณ์ Android ทั้งหมด


ไม่แนะนำให้ใช้คำตอบแบบใช้รหัสเท่านั้น โปรดคลิกที่แก้ไขและเพิ่มคำที่สรุปว่ารหัสของคุณตอบคำถามอย่างไรหรืออาจอธิบายว่าคำตอบของคุณแตกต่างจากคำตอบ / คำตอบก่อนหน้าอย่างไร จากรีวิว
Nick

0

วิธีแก้ปัญหานั้นง่ายมาก!

มีเหตุผลพื้นฐานสามประการสำหรับปัญหานี้

  1. คุณกำลังทำงานหนัก / วิ่งยาว / ซับซ้อนในฟังก์ชัน onCreateVeiw
  2. หากคุณกำลังใช้ Thread. จากนั้นเวลานอนของเธรดอาจมีขนาดใหญ่มาก
  3. หากคุณกำลังใช้ใด ๆห้องสมุดของบุคคลที่สาม ซึ่งจะเริ่มต้นในเวลาเริ่มต้นแอปอาจทำให้เกิดปัญหานี้

Solutions:

แนวทางที่ 1:

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

แนวทางที่ 2:

  Reduce the Thread Sleep time.

แนวทางที่ 3:

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

ในกรณีของฉันฉันใช้ Sugar ORM ซึ่งนำไปสู่ปัญหานี้

แบ่งปันเพื่อปรับปรุง.


0

สิ่งนี้ช่วยแก้ปัญหาได้:

แก้ไขไฟล์ styles.xml ของคุณ:


วางรหัสด้านล่าง:

<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>

และอย่าลืมทำการแก้ไขในไฟล์AndroidManifest.xml ( ชื่อธีม )

ระวังลำดับการประกาศของกิจกรรมในไฟล์นี้


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>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.