9

この問題は、半透明のナビゲーションが利用可能かどうかの確認に似ていますが、完全ではありません。CyanogenMod 11 または同等の Android 4.4 でフラッシュされた Nexus 4 があり、FLAG_TRANSLUCENT_NAVIGATION を使用して横向きモードで実行されているアプリは、縦向きモードのようなシステム UI の半透明性を備えていません。

Android 4.4 用に構築された半透明のボタンを備えたランドスケープ モードの Google アプリを見たことがないため、Nexus 5 でも同じ問題を再現できます。

これは私が使用しているコードです

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 に答える