从沉浸式模式返回时,操作栏显示不正确

时间:2015-03-05 09:20:47

标签: android android-5.0-lollipop android-support-library android-fullscreen

我在[{1}}中从沉浸模式返回了一些问题。我创建了一个简单的应用来说明这个问题。有一个按钮可以切换沉浸式模式。当"返回"从沉浸式模式开始,动作条从原始位置向下偏移,大致相同的距离,通常偏离屏幕顶部。

我在运行Lollipop的Nexus 4上试过这个。这种行为在Lollipop之前没有发生。

屏幕截图beforeimmersedafter

一个简单的ActionBarActivity说明了这个问题:

ActionBarActivity

清单中没有任何幻想:

public class MainActivity extends ActionBarActivity {
    private boolean immersed;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void enterImmersiveMode() {
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().getDecorView().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
                    | View.SYSTEM_UI_FLAG_FULLSCREEN
                    | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    );
            immersed = true;
        }
    }

    @TargetApi(Build.VERSION_CODES.KITKAT)
    private void leaveImmersiveMode() {
        if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
            immersed = false;
//          recreate();
        }
    }

    public void toggleImmersive(View v) {
        if (immersed) {
            leaveImmersiveMode();
        } else {
            enterImmersiveMode();
        }
    }
}

琐碎的布局:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.immersivetest"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="ImmersiveTest"
        android:theme="@style/Theme.AppCompat" >
        <activity
            android:name=".MainActivity"
            android:label="ImmersiveTest" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

我目前使用的解决方法是在离开沉浸式模式后调用<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.immersivetest.MainActivity" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="toggle immersive" android:onClick="toggleImmersive" /> </RelativeLayout> ,但它看起来有点&#34;毛刺&#34;。

如果我启动recreate()并使用minSdkVersion代替Activity,即不使用支持库,那么我就不会遇到此行为。

我知道沉浸式模式仅适用于KitKat +并且我不需要使用支持库中的ActionBarActivity,但最终产品必须在api版本8+上运行并且沉浸式模式是一个可选的附加模式。

我现在考虑并解雇的其他一些解决方法:

  1. 有一个包装器启动程序ActionBarActivity,它会立即以编程方式转发给Activity以获取较低的api版本。
  2. api版本有多个apks。
  3. 这些选项中的任何一个都听起来像很多额外的维护。

    还有什么我可以尝试的吗?在从沉浸式模式返回时,上面的代码中是否有任何明显的错误?

    更新

    我已经将Nexus 4更新为5.1,支持库更新为rev 22.1.1,行为仍然相同。我还更新了代码以使用新的ActionBarActivity,因为AppCompatActivity现已弃用。这种行为再一次是相同的。

    ActionBarActivity

    更新

    这种奇怪的行为也延伸到横向模式。除了屏幕顶部的偏移量外,操作栏末端和导航按钮之间的屏幕右侧还有一个偏移量。有趣的是,这种偏移似乎又是导航按钮的大小&#34; bar&#34;,即大于顶部的偏移量。

    横向屏幕截图beforeimmersedafter

3 个答案:

答案 0 :(得分:0)

使用Toolbar ...我遇到了同样的问题,切换到Toolbar而不是customContentView解决了它。

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

并将您的活动主题设置为@style/Theme.AppCompat.NoActionBar

答案 1 :(得分:0)

有同样的问题,修复此问题: 您的leaveImmersiveMode()函数应该使用这些标志:

getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_FULLSCREEN);

答案 2 :(得分:0)

尽管从支持版本V26开始不赞成使用ActionBarActivity,但更改leaveImmersiveMode()方法以指定以下标志对于使用您的代码的测试应用程序来说还是可以解决我的问题(最初显示出您的额外差距提到)。

@TargetApi(Build.VERSION_CODES.KITKAT)
private void leaveImmersiveMode() {
    if(android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        immersed = false;
//          recreate();
    }
}

这些是Android documentation on immersive mode中推荐的标志。