getDecorView方法返回视图包含棒棒糖上的导航栏视图?

时间:2014-11-27 07:55:31

标签: android-activity android-5.0-lollipop slidingmenu

我使用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 bar my bottom layout behind of navigation bar

我将SlidingMenu.SLIDING_WINDOW更改为SlidingMenu.SLIDING_CONTENT。 它起作用,但动作栏总是在顶部。

查看SlidingMenu的源代码,我发现此代码添加了滑动菜单。

    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棒棒糖中找到。

4 个答案:

答案 0 :(得分:22)

你可以像这样避免这种风格:

<!-- 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" />

答案 1 :(得分:4)

GitHub上的SlidingMenu打开了相同的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 :(得分:3)

硬件和软件导航栏都有一个很好的解决方法。

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

请参阅:https://github.com/jfeinstein10/SlidingMenu/issues/680#issuecomment-73912402

答案 3 :(得分:1)

结论:没有解决方案。只有hackish变通办法,你会得到以下效果之一: - 状态栏未着色 - 没有软导航栏的设备上额外的不必要填充 - 完全隐藏的导航布局

以上都不是解决方案。丑陋,无用的黑客。真的,没有解决方案?真?我可以看到许多应用程序,包括Android系统拨号程序或短信应用程序 - 他们能够显示彩色状态栏,导航ui永远不会隐藏,没有软导航栏的设备上没有丑陋的填充。 Cardview,ListView使用,一切都好。

怎么可能![/ p>