Библиотека MaterialDrawer превращает полупрозрачную строку состояния в непрозрачную

Я использую библиотеку MaterialDrawer для добавления ящика в свои действия. Действия должны иметь полупрозрачную строку состояния. Как на картинке ниже:

введите здесь описание изображения

Это верхняя часть моей активности, когда к ней еще не добавилась библиотека.

Когда я добавляю ящик с помощью библиотеки:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DrawerMenu.addTo(this);
    }

}

И вспомогательный класс DrawerMenu:

public class DrawerMenu {
    public static void addTo(final Activity activity) {
        AccountHeader headerResult = new AccountHeaderBuilder()
            .withActivity(activity)
            .withHeaderBackground(R.drawable.drawer_header)
            .addProfiles(
                    new ProfileDrawerItem()
                            .withName("Ashkan")
                            .withEmail("[email protected]")
                            .withIcon(ContextCompat.getDrawable(activity, R.drawable.profile_pic))
            )
            .withOnAccountHeaderListener(new AccountHeader.OnAccountHeaderListener() {
                @Override
                public boolean onProfileChanged(View view, IProfile profile, boolean currentProfile) {
                    return false;
                }
            })
            .build();

        new DrawerBuilder()
            .withActivity(activity)
            .withAccountHeader(headerResult)
            .addDrawerItems(new PrimaryDrawerItem().withName("Login"))
            .withOnDrawerItemClickListener(new Drawer.OnDrawerItemClickListener() {
                @Override
                public boolean onItemClick(View view, int i, IDrawerItem iDrawerItem) {
                    Toast.makeText(activity, "Login!!!", Toast.LENGTH_LONG).show();
                    return true;
                }
            })
            .build();
    }
}

Я получу этот результат:

введите здесь описание изображения

Строка состояния, очевидно, непрозрачна, и содержимое активности не находится под ней.

Однако, когда я открываю ящик, он идет под строкой состояния:

введите здесь описание изображения

Также это тема, которую я применяю к деятельности:

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:windowTranslucentStatus">true</item>
    <item name="android:windowTranslucentNavigation">false</item>
</style>

В чем проблема?


person Ashkan Sarlak    schedule 28.09.2015    source источник


Ответы (1)


Скриншот, который вы опубликовали, выглядит так, как будто ваше приложение должно отображаться в полноэкранном режиме.

Таким образом, с опубликованными вами снимками экрана вы используете базовую конфигурацию MaterialDrawer. В большинстве случаев люди, которые используют ящик, хотят, чтобы их содержимое (включая Панель инструментов) отображалось ниже Статусбара, а ящик находился за панелью состояния. >Статусбар. Итак, что в основном происходит здесь, так это то, что логика MaterialDrawer переводит ваше приложение в полупрозрачный режим StatusBar, поэтому содержимое перемещается за ним. Кроме того, он добавит ScrimInsetsFrameLayout, который затем добавит отступ вверху, чтобы содержимое было ниже StatusBar.

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

Это можно реализовать, добавив флаг withFullscreen(true) к Builder элемента MaterialDrawer.

Вот как это делается программно

//Create the drawer
result = new DrawerBuilder()
    .withActivity(this)
    .withFullscreen(true)
    .withSavedInstance(savedInstanceState)
    .build();

Это также сделает полупрозрачным ваш NavigationBar.

Существует открытая проблема по этой теме, которая, вероятно, также улучшит поведение здесь. https://github.com/mikepenz/MaterialDrawer/issues/698

Поэтому реализация дополнительного флага, чтобы не включать ScrimInsetsFrameLayout https://github.com/mikepenz/MaterialDrawer/issues/698#issuecomment-143674729

Хорошо, как дополнение. Если вы хотите, чтобы только StatusBar была полупрозрачной. тогда вам нужно сделать следующее. Используйте одну из тем TranslucentStatus (или ее дочернюю) для этого действия.

@style/MaterialDrawerTheme.Light.TranslucentStatus

А затем создайте ящик, как показано здесь:

//Create the drawer
result = new DrawerBuilder()
    .withActivity(this)
    .withFullscreen(true)
    .withTranslucentNavigationBarProgrammatically(false)
//note that the translucentNavigationBarProgrammatically comes AFTER the withFullscreen method

Это приведет к прозрачной StatusBar, но с черной NavigationBar.

person mikepenz    schedule 28.09.2015
comment
Да, он отображается в полноэкранном режиме, как предлагает тема, которую я разместил. Я думаю, было бы полезно, если бы вы указали информацию о полноэкранных действиях в README, поскольку полноэкранный режим сейчас распространен в проектах. Кстати, спасибо, это решило проблему. Продолжайте хорошую работу. - person Ashkan Sarlak; 28.09.2015
comment
@AshkanSarlak да, я всегда думаю, что люди проверяют образец приложения и запускают его, так как оно также есть в Google Play. Просто чтобы сообщить вам. я расширил ответ о том, как получить только полупрозрачную панель состояния и обычную панель навигации. - person mikepenz; 28.09.2015
comment
О, я забыл сказать это. Ваш первоначальный ответ НЕ сделал NavigarionBar полупрозрачным. Я предполагаю, что это из-за темы и атрибута ‹item name=android:windowTranslucentNavigation›false‹/item›. - person Ashkan Sarlak; 29.09.2015
comment
@AshkanSarlak да, может быть. Я просто подумал, что добавлю информацию, чтобы другим, кто читает это, было легче решить свою проблему. - person mikepenz; 29.09.2015