gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:07:34 28 4
gpt4 key购买 nike

我在 ActionBarActivity 中从沉浸式模式返回时遇到了一些问题。我创建了一个简单的应用程序来说明这个问题。有一个带有单个按钮的布局来切换沉浸式模式。当从沉浸式模式“返回”时,操作栏从其原始位置向下偏移,与通常从屏幕顶部偏移的距离大致相同。

我已经在运行 Lollipop 的 Nexus 4 上进行了尝试。这种行为在 Lollipop 之前没有发生。

截图before , immersed , after .

一个简单的 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();
}
}
}

list 中没有什么花哨的:

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

我目前使用的解决方法是在离开沉浸模式后调用 recreate(),但它看起来有点“故障”。

如果我启动 minSdkVersion 并使用 Activity 而不是 ActionBarActivity,即不使用支持库,那么我没有体验这种行为。

我了解沉浸式模式仅在 KitKat+ 中可用,并且我不需要使用支持库中的 ActionBarActivity,但成品必须在 API 版本 8+ 和沉浸式模式是可选的附加功能。

我已经考虑过并暂时放弃的其他一些解决方法:

  1. 有一个包装器启动器 Activity,它会立即以编程方式转发到较低 API 版本的 ActionBarActivity
  2. 按 API 版本拥有多个应用。

这些选项中的任何一个听起来都需要大量额外的维护。

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

更新

我已经将 Nexus 4 更新到 5.1,并将支持库更新到 22.1.1,并且行为仍然相同。我还更新了代码以使用新的 AppCompatActivity,因为现在不推荐使用 ActionBarActivity。行为再次相同。

public class MainActivity extends AppCompatActivity {
// no changes here
}

更新

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

横向截图before , immersed , after .

最佳答案

遇到了同样的问题,解决了这个问题:您的 leaveImmersiveMode() 函数应该使用这些标志:

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

关于android - 从沉浸式模式返回时操作栏显示不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28874114/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com