启动画面屏幕上出现奇怪的黑色矩形

3

更新:最终找到了一种有点取巧的解决方案,但对我来说不可接受。 所有想法都可能有用。

我有一个启动画面活动,并且我不使用setContentView()。 我使用android:windowBackgroundstyles.xml设置背景。

当启动画面开始时,突然出现了一个黑色矩形,位于屏幕左下角。高度与NavigationBar的完全相同,从屏幕的左侧开始,直到屏幕中央。

这个黑色矩形仅会出现在具有NavigationBar的设备上。没有物理按键。并且只有在尝试在全屏活动中隐藏或显示NavigationBar时才可见。

问题:这个bug的原因是什么?我该怎么解决它?

您可以在下面看到整个事件。(从启动画面到登录画面的过渡)

这是我的启动活动样式:

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

    }
}

你是否使用“显示布局边界”来检查这个问题?那里实际上有一些视图吗? - azizbekian
@azizbekian发布了一个答案,你可以查看。 - Oğuzhan Döngül
1个回答

1

最终找到了一个有点hacky的解决方案,但对我来说不可接受。任何想法都可能会有用。

首先,使用布局检查器并获得以下结果:

enter image description here

DecorView 下,启动闪屏活动后会创建一个不需要的奇怪 View
它会在半秒钟内闪烁并消失。
在闪烁后,如果用户触发屏幕以显示导航栏,则此奇怪的视图再次出现(永久性)。
添加后,闪烁的视图消失了。
<item name="android:windowIsTranslucent">true</item>

我希望你能适应我的活动方式。

另一部分比较复杂。 在activity的DecorView中添加了一个OnHierarchyChangeListener。将我的DecorView转换为FrameLayout,并重写onChildViewAdded()回调以在添加到DecorView后删除所有子项。

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

    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接