2017-04-26 10 views
3

UPDATE: Schließlich finden Sie ein bisschen Hacky-Lösung. Aber es ist nicht akzeptabel für mich. Alle Ideen können nützlich sein.Splash Screen seltsam schwarz Rechteck auf dem Bildschirm

Ich habe eine Splash Screen Activity und ich benutze setContentView() nicht. I set Hintergrund von styles.xml mit der Verwendung von android: windowBackground

Wenn Splash-Screen gestartet, ein schwarzes Rechteck zeigt aus dem Nichts auf, an den linken unteren Teil des Bildschirms. Höhe ist genau die gleiche Höhe mit NavigationBar, beginnt von der linken Seite des Bildschirms und endet in der Mitte des Bildschirms.

Dieses schwarze Rechteck erscheint nur bei Geräten, die haben Navigationsleiste. Nicht physische Tasten. Und auch nur sichtbar, wenn Sie versuchen, verstecken oder zeigen Navigationsleiste bei einer FullScreen Aktivität.

FRAGE: Was ist der Grund dieses Fehlers sein kann? Wie kann ich es lösen?

Sie können die gesamte Veranstaltung unten sehen. (Splash Screen zum Login-Bildschirm Übergang)

Hier meine splash Aktivität Stil:

<style name="SplashTheme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/colorPrimary</item> 
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item> 
    <item name="colorAccent">@color/colorAccent</item> 
    <item name="android:windowBackground">@drawable/background_splash</item> 
    <item name="windowNoTitle">true</item> 
    <item name="windowActionBar">false</item> 
    <item name="android:windowFullscreen">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
</style> 

background_splash.xml

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"> 
    //Tried different colored layer at bottom level but did not affect 
    <item> 
     <shape android:shape="rectangle"> 
      <solid android:color="@color/grey_Dark"/> 
     </shape> 
    </item> 

    //Background image 
    <item 
     android:drawable="@drawable/bg" 
     android:gravity="center"/> 

    //9-patch Logo at the center 
    <item 
     android:drawable="@drawable/splash_logo" 
     android:gravity="center"/> 

</layer-list> 

ActivitySplash

public class ActivitySplash extends BaseActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final View decorView = getWindow().getDecorView(); 
     decorView.setSystemUiVisibility(
      View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar 
        | View.SYSTEM_UI_FLAG_FULLSCREEN 
        | View.SYSTEM_UI_FLAG_IMMERSIVE); 


     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       Intent intent = new Intent(ActivitySplash.this, ActivityLogin.class); 
       startActivity(intent); 
       finish(); 
      } 
     }, 2000); 

    } 
} 
+0

Haben Sie dieses Problem mit "Layoutgrenzen anzeigen" aktiviert? Ist das tatsächlich eine Ansicht dort? – azizbekian

+0

@azizbekian eine Antwort geschrieben, können Sie überprüfen. –

Antwort

1

Schließlich finden Sie ein bisschen hacky Lösung. Aber es ist nicht akzeptabel für mich. Irgendwelche Ideen können nützlich sein.

Zuerst Layout-Inspektoren verwendet und dieses Ergebnis:

enter image description here

Unter DecorView gibt es eine unerwünschte seltsamen Ansicht nach der Splash-Aktivität erstellt wird.

Es blinkt in einer halben Sekunde und verschwindet.

Nach dem Blinken, wenn Benutzer Bildschirm zum Anzeigen der Navigationsleiste auslöst, erscheint diese seltsame Ansicht wieder (permanent).

Blinzeln Ansicht verschwand nach

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

meiner activitty Stil hinzufügen.

Andere Teil ist komplizierter. Ein OnHierarchyChangeListener zu DecorView der Aktivität hinzugefügt. Habe mein DecorView in FrameLayout eingefügt und onChildViewAdded() überschrieben Rückruf, um alle untergeordneten Elemente nach dem Hinzufügen zu DecorView zu entfernen.

final FrameLayout myDecorView = (FrameLayout) decorView; 
myDecorView.setOnHierarchyChangeListener(new ViewGroup.OnHierarchyChangeListener() { 
    @Override 
    public void onChildViewAdded(View parent, View child) { 
     myDecorView.removeView(child); 
    } 

    @Override 
    public void onChildViewRemoved(View parent, View child) { 

    } 
});