9

此问题类似于检查半透明导航是否可用但不完全可用。我有一个装有 CyanogenMod 11 或 Android 4.4 等效版本的 Nexus 4,并且任何以横向模式运行且带有 FLAG_TRANSLUCENT_NAVIGATION 的应用程序在系统 UI 上都不像纵向模式那样具有半透明性。

同样的问题可以在 Nexus 5 上重现,因为我没有看到任何为 Android 4.4 在横向模式下使用半透明按钮构建的谷歌应用程序。

这是我正在使用的代码

int API_LEVEL =  android.os.Build.VERSION.SDK_INT;

if (API_LEVEL >= 19)
{
    getWindow().addFlags( WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION );     
}

虽然窗户表面变大(并且无法使用),但没有半透明性。

所以问题是,我是否需要做任何额外的事情才能使其在横向模式下工作?或者这是一个Android错误?

4

2 回答 2

3

我不知道他们是否打算改变这种行为,但这似乎是故意的。自从FLAG_TRANSLUCENT_NAVIGATION在 Android Kitkat 中引入以来,“手机”大小的设备在横向屏幕的右侧总是有一个不透明的黑色导航栏。即使在本文发布时,Android Lollipop ( FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS) 中也有一个新标志,它具有相同的行为,无论传递给setStatusBarColor()).

这是一些粗略的代码,您可以使用它来了解导航栏样式何时超出您的控制。

class MyActivity extends Activity {
    // ...
    boolean isNavigationForcedBlack() {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
            return true;
        }
        final int windowFlags = getWindow().getAttributes().flags;
        int navControlFlags = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            navControlFlags |= WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS;
        }
        if ((windowFlags & navControlFlags) == 0) {
            return true;
        }

        boolean deviceHasOpaqueSideLandscapeNav = getDeviceSmallestWidthDp() < 600;
        boolean isLandscape = getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE;

        return deviceHasOpaqueSideLandscapeNav && isLandscape;
    }
    DisplayMetrics dm = new DisplayMetrics();
    float getDeviceSmallestWidthDp() {
        getWindowManager().getDefaultDisplay().getRealMetrics(dm);
        float widthDp = dm.widthPixels / dm.density;
        float heightDp = dm.heightPixels / dm.density;
        return Math.min(widthDp, heightDp);
    }
}
于 2014-10-21T16:16:49.373 回答
-1

您可以使用以下代码查看当前设备上是否可以使用半透明效果:

int id = getResources().getIdentifier("config_enableTranslucentDecor", "bool", "android");
if (id != 0 && getResources().getBoolean(id)) { // Translucent available
    Window w = getWindow();
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION, WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
    w.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS, WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}

使用此代码,您可以检查设备是否可以使用FLAG_TRANSLUCENT_NAVIGATIONFLAG_TRANSLUCENT_STATUS标志。然后,您必须说您希望 Actionbar、通知栏和软按钮栏与您的布局重叠(在setContentView(R.layout.yourlayout);in之前调用onCreate()):

getWindow().requestFeature(Window.FEATURE_ACTION_BAR_OVERLAY);

不要忘记为您的内容添加一些填充以避免它无法访问,因为它会被这些元素“隐藏”。为了实现这一点,您可以android:fitsSystemWindows="true"在布局中的主容器上添加属性。

于 2013-12-26T20:35:49.000 回答