Почему панель навигации появляется в полноэкранных приложениях при нажатии на всплывающее меню

У меня есть полноэкранное приложение:

MainActivity.java:

public class MainActivity extends AppCompatActivity {

@TargetApi(Build.VERSION_CODES.KITKAT)
private void removeControlBar(){
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
@Override
public void onResume(){
    super.onResume();
    removeControlBar();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

}

Манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="test.behy.android.test">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme.NoActionBar">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

это полноэкранный режим, но когда я нажимаю всплывающее меню, появляется панель навигации (панель, включая домой, назад)!

Вопрос:

  • почему это так?
  • как я могу это исправить (чтобы панель навигации не появлялась)?

(Я пытался удалить заголовок и добавить ImageButton с всплывающим меню, но это было точно так же!) спасибо за помощь!


person Behy    schedule 21.12.2015    source источник
comment
Пожалуйста, не редактируйте исходный вопрос, чтобы задать другой вопрос. Если у вас есть новый вопрос или даже основанный на этом вопросе, но у вас есть другие вопросы, пожалуйста, задайте новый вопрос, а не редактируйте этот. Однако, если ваш вопрос (часть, которую вы задали) решен благодаря ответу г-жи Иветт, не забудьте принять его. Если это не поможет, опубликуйте свой ответ, который может помочь другим. Также посетите наш тур или справочный центр для получения более подробной информации. .   -  person Casimir Crystal    schedule 23.12.2015
comment
@Behy, у меня та же проблема. Вы уже нашли решение?   -  person TOP    schedule 02.12.2016
comment
@Behy Ребята, вы уже поняли это?   -  person DaveNOTDavid    schedule 21.01.2017


Ответы (1)


Вы пытаетесь управлять липким погружением, вызывая его в методе onresume. Это означает, что после изменения состояния оно не будет восстановлено до следующего возобновления активности.

Избавьтесь от этого private void removeControlBar()

Вам нужно управлять им через метод windows onfocuschanged.

Таким образом, можно отслеживать предупреждения, а панели навигации и т. д. не будут возвращаться к виду при работе со всплывающими окнами.

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if (hasFocus) {
        decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    }
}

Документы Использование липкого погружения и подробное объяснение здесь.

person Community    schedule 21.12.2015
comment
применив это, мое приложение таково: при нажатии на меню появляется панель навигации, когда я нажимаю на пункт меню, панель исчезает, лучше, но не исчезает ПОЛНОСТЬЮ - person Behy; 21.12.2015
comment
точно, когда я нажимаю на всплывающее меню, также появляется панель навигации, а при нажатии на элемент меню она исчезает - person Behy; 21.12.2015
comment
Вы имеете в виду, что технически невозможно скрыть панель навигации во время работы приложения? - person Behy; 21.12.2015
comment
@YvetteColomb У меня та же проблема, что и у Бехи. Я использую ваш код. Но панель навигации по-прежнему появляется, когда я нажимаю всплывающее меню. - person TOP; 02.12.2016
comment
@YvetteColomb Вы правы, но я разрабатываю игру, и было бы лучше, если бы системные панели вообще не отображались, если это возможно, то есть. - person DaveNOTDavid; 21.01.2017
comment
@Behy используйте dropdown.setFocusable(false), чтобы предотвратить всплывающее окно панели навигации - person alloha; 08.12.2018
comment
плюс рассмотрите возможность добавления dropdown.setOutsideTouchable(true); - person alloha; 08.12.2018
comment
@alloha не стесняйтесь добавлять изменения. Это старый ответ. - person ; 08.12.2018