16

enter image description hereсодержания приложения идет позади панели навигации в андроиде L

Как вы можете видеть мой «Got It» кнопка находится позади навигации bar.Not в состоянии это исправить !!! Я пробовал

<item name="android:fitsSystemWindows">true</item> 

Как и установка его в файле макета.

моя тема в цене-21 является:

<style name="AppTheme" parent="android:Theme.Material.Light.NoActionBar"> 
     <item name="android:windowNoTitle">true</item> 
     <item name="android:windowActionBar">false</item> 
     <item name="android:windowFullscreen">false</item> 
     <item name="android:windowContentOverlay">@null</item> 
     <item name="android:fitsSystemWindows">true</item> 
    </style> 

Его же случай со всеми экранами по всему приложению.

Пожалуйста, помогите.

+1

Попробуйте: View.bringToFront(); –

+0

@ user863873: макет не должен использовать это пространство. Он должен быть выше этих кнопок. –

+0

Вы смогли поставить кнопку «Got it» перед навигационной панелью? Мне просто не кажется, что это случилось. Вы можете мне помочь?Какие еще флаги вы добавили в окно? Я добавил все ваши флаги, но панель навигации всегда впереди моей деятельности. – user3632055

ответ

24

Вот решение.

Большинство макетов разрешится путем добавления этих свойств в ценностно-21 style.xml

<item name="android:windowTranslucentStatus">true</item> 
     <item name="android:windowTranslucentNavigation">true</item> 
     <item name="android:fitsSystemWindows">true</item> 

для других, я вычислил Hight навигационной панели и добавить маржу на мой взгляд.

public static int getSoftButtonsBarSizePort(Activity activity) { 
    // getRealMetrics is only available with API 17 and + 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
     DisplayMetrics metrics = new DisplayMetrics(); 
     activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); 
     int usableHeight = metrics.heightPixels; 
     activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics); 
     int realHeight = metrics.heightPixels; 
     if (realHeight > usableHeight) 
      return realHeight - usableHeight; 
     else 
      return 0; 
    } 
    return 0; 
} 

Примечание: Используя выше решения все работы, но я также использовал PopupWindow в моей app.The макет PopupWindow получить перепутались в андроида L. Ищите проблемы и решения here

+6

Я добавил следующее в моем стиле <пункт имени = "андроид: windowTranslucentNavigation"> истинных <имя элемента = "Android: fitsSystemWindows"> истинных Это работает! Никакой контент не отображается за панель навигации. Кроме того, теперь моя панель навигации темно-серая, а не черная. Включение TranslucentNavigation в false делает черную черту, но контент за ней стоит. Думаете, вы могли бы объяснить, почему эти атрибуты работают, и как сохранить навигационную панель черной? – klong15

+0

Вы определили метод, но вы не сказали нам, как его использовать или называете. Можете ли вы любезно сказать нам, где назвать этот метод и как использовать его возвращение. – Neri

+0

Это помогает, но как узнать, когда пользователь открывает или закрывает панель программных навигационных клавиш? Чтобы мы могли изменить размер прокладки? –

0

Настройка softInputMode popupWindow на «SOFT_INPUT_ADJUST_RESIZE» устраняет проблему.

0

Просто установите это в OnCreate Activity (в), при настройке вида контента:

int mScreenWidth = getWindowManager().getDefaultDisplay().getWidth(); 
int mScreenHeight = getWindowManager().getDefaultDisplay().getHeight(); 
View view = getLayoutInflater().inflate(R.layout.activity_main, null); 
setContentView(view, new ViewGroup.LayoutParams(mScreenWidth, mScreenHeight)); 
2

Для хорошего пользовательского опыта вы не должны блокировать область навигационных клавиш с использованием android:windowTranslucentNavigation

, а здесь это лучшее решение, если вы используете библиотеку ResideMenu, то просто добавьте этот метод в ResideMenu.java

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

и если вы используете SlidingMenu библиотеки затем изменить моды для SLIDING_CONTENT по:

menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT); 

Надеется, что это сэкономит ваше время

+0

+1 Я столкнулся с такой же проблемой из-за ResideMenu, и этот ответ помог мне, потратив столько времени. Благодаря! – WonderSoftwares

0

Используйте этот код в вашем OnCreate метода вашего Activity (Если у вас есть BaseActivity вы можете сделать это там так все мероприятия применяются это):

ViewCompat.setOnApplyWindowInsetsListener(
      findViewById(android.R.id.content), (v, insets) -> { 
       ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) v.getLayoutParams(); 
       params.bottomMargin = insets.getSystemWindowInsetBottom(); 
       return insets.consumeSystemWindowInsets(); 
      }); 

Когда макет имеет этот флаг, то это означает, что эта схема задает систему, чтобы быть применены окнами вставок. В нашем случае это означало бы, что FrameLayout желает применить дополнение, равное высоте строки состояния.

+0

Для предварительной лямбды: '.setOnApplyWindowInsetsListener (findViewById (android.R.id.content), нового OnApplyWindowInsetsListener() { @Override общественного WindowInsetsCompat onApplyWindowInsets (View v, WindowInsetsCompat вставок) { // .. } } ); ' – gnB

Смежные вопросы