android-activity android-5.0-lollipop slidingmenu

android activity - La vista de retorno del método getDecorView incluye la vista de la barra de navegación en lollipop?



android-activity android-5.0-lollipop (5)

SlidingMenu en GitHub ha abierto el mismo problema .

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); } }

Uso SlidingMenu para implementar mis menús deslizables.

El código es

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); }

Entonces tengo un problema es mi diseño detrás de la barra de navegación.

Y cambio SlidingMenu.SLIDING_WINDOW a SlidingMenu.SLIDING_CONTENT. Es trabajos, pero la barra de acciones siempre está en la parte superior.

Mira el código fuente de SlidingMenu, encuentro este código para agregar 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; }

¿Cómo puedo arreglarlo? Este error solo se encuentra en Android 5.0 lollipop.


Podría evitar este estilo su actividad como esta:

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



Conclusión: no hay solución. Solo soluciones provisionales, obtendrá uno de los siguientes efectos: - barra de estado no coloreada - relleno adicional innecesario en dispositivos sin barra de navegación suave - diseño de navegación completamente oculto

Ninguno de los anteriores es una solución. Feos, inútiles hacks. Realmente, no hay solución? De Verdad? Puedo ver muchas aplicaciones, incluido el marcador del sistema Android o la aplicación de sms; pueden mostrar barras de estado de colores, la navegación nunca se esconde y ningún relleno feo en dispositivos sin barra de navegación. Cardview, ListView utilizado, todo está bien.

¿Cómo diablos es posible?


este funciona bien, simplemente calcule la altura de la barra de navegación para dispositivos Lollipop y agréguela a paddingBottom

Biblioteca ResideMenu de Android, la parte inferior de Fragment tiene un problema de cultivo

@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; }