Обратное представление метода getDecorView включает отображение панели навигации на леденец?

Я использую SlidingMenu для реализации моих слайд-меню.

Код

private void initSlidingMenu()
{
    // configure the SlidingMenu
    menu = new SlidingMenu(this);
    menu.setMode(SlidingMenu.LEFT);
    menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
    menu.setShadowWidthRes(R.dimen.shadow_width);
    //        menu.setShadowDrawable(R.drawable.shadoew);
    menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
    //        menu.setFadeDegree(0.35f);
    menu.attachToActivity(this, SlidingMenu.SLIDING_WINDOW);
    menu.setMenu(R.layout.menu_main_sliding);
}

Тогда у меня возникла проблема - мой макет из-за панели навигации. my bottom view behind of navigation barmy bottom layout behind of navigation bar

И я изменяю SlidingMenu.SLIDING_WINDOW на SlidingMenu.SLIDING_CONTENT. Он работает, но панель действий всегда находится сверху.

Посмотрите на исходный код SlidingMenu, я нахожу этот код, чтобы добавить slidemenu.

    switch (slideStyle) {
    case SLIDING_WINDOW:
        mActionbarOverlay = false;
        ViewGroup decor = (ViewGroup) activity.getWindow().getDecorView();
        ViewGroup decorChild = (ViewGroup) decor.getChildAt(0);
        // save ActionBar themes that have transparent assets
        decorChild.setBackgroundResource(background);
        decor.removeView(decorChild);
        decor.addView(this);
        setContent(decorChild);
        break;
    case SLIDING_CONTENT:
        mActionbarOverlay = actionbarOverlay;
        // take the above view out of
        ViewGroup contentParent = (ViewGroup)activity.findViewById(android.R.id.content);
        View content = contentParent.getChildAt(0);
        contentParent.removeView(content);
        contentParent.addView(this);
        setContent(content);
        // save people from having transparent backgrounds
        if (content.getBackground() == null)
            content.setBackgroundResource(background);
        break;
    }

Как я могу это исправить? Эта ошибка встречается только в лексиконе на Android 5.0.

Ответ 1

SlidingMenu на GitHub открыл тот же issue.

private int getNavigationBarHeight() { 
    Resources resources = getResources();
    int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
    if (resourceId > 0) {
        return resources.getDimensionPixelSize(resourceId);
    } 
    return 0; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        int navBarHeight = getNavigationBarHeight();
        findViewById(R.id.base_frame).setPadding(0, 0, 0, navBarHeight);
        findViewById(R.id.menu_frame).setPadding(0, 0, 0, navBarHeight);
    } 
} 

Ответ 2

Вы могли бы избежать этого стиля вашей деятельности следующим образом:

<!-- values-v21/styles.xml -->
<resources xmlns:android="http://schemas.android.com/apk/res/android">

    <style name="Theme" parent="FrameworkRoot.Theme">
        <item name="android:windowDrawsSystemBarBackgrounds">false</item>
    </style>

</resources>


<!-- AndroidManifest.xml -->
<activity
        android:name="com.yourpackage.YourActivity"
        android:theme="Theme"
        android:screenOrientation="portrait" />

Ответ 3

Существует хорошее обходное решение для панели управления оборудованием и программным обеспечением.

if(Build.VERSION.SDK_INT >= 21)
    setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

Смотрите: https://github.com/jfeinstein10/SlidingMenu/issues/680#issuecomment-73912402

Ответ 4

этот режим отлично работает, просто рассчитайте высоту навигационной панели для устройств Lollipop и добавьте это в paddingBottom

Библиотека Android ResideMenu, в нижней части фрагмента есть проблема с обрезкой

@Override
    protected boolean fitSystemWindows(Rect insets) {
        int bottomPadding=insets.bottom;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Resources resources = getResources();
            int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
            if (resourceId > 0) {
                bottomPadding += resources.getDimensionPixelSize(resourceId);
            }
        }
        this.setPadding(viewActivity.getPaddingLeft() + insets.left, viewActivity.getPaddingTop() + insets.top,
                viewActivity.getPaddingRight() + insets.right, viewActivity.getPaddingBottom() + bottomPadding);
        insets.left = insets.top = insets.right = insets.bottom = 0;
        return true;
    }

Ответ 5

Заключение: решения нет. Только хакерские обходные пути, вы получите один из следующих эффектов: - строка состояния не окрашена - дополнительное ненужное дополнение на устройствах без мягкой навигации - полностью скрытая макет навигации

Ничто из вышеизложенного не является решением. Уродливые, бесполезные хаки. Неужели нет решения? В самом деле? Я вижу множество приложений, в том числе системный дозвон для системы Android или sms-приложение, - они могут отображать цветную строку состояния, навигацию ui никогда не скрывает и не уродливое дополнение на устройствах без мягкой навигационной панели. Cardview, ListView используется, все нормально.

Как, черт возьми, это возможно!