Обратное представление метода 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 bar]()
![my 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 используется, все нормально.
Как, черт возьми, это возможно!