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" />
Existe una buena solución para Hardware y Software Navigation Bar.
if(Build.VERSION.SDK_INT >= 21)
setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
Ver: https://github.com/jfeinstein10/SlidingMenu/issues/680#issuecomment-73912402
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;
}