Действовать только ОДИН РАЗ, когда NavigationDrawer ОТКРЫТ

Я долго искал решение для этого. Вот чего я пытаюсь достичь. У меня NavigationDrawer реализован со следующим меню:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
 <group android:checkableBehavior="single">
    <item
        android:id="@+id/nav_dashboard"
        android:icon="@drawable/ic_dashboard"
        android:title="Dashboard" />
    <item
        android:id="@+id/nav_logbook"
        android:icon="@drawable/ic_logbook"
        android:title="Logbook" />
    <item
        android:id="@+id/nav_context"
        android:icon="@drawable/ic_context"
        android:title="Context" />
 </group>
</menu>

Когда будет добавлен новый контекст, я хочу показать это пользователю в навигационном блокноте, добавив количество новых обновлений в скобках. Вот так например: Context (2) когда есть два новых обновления.

Я хочу проверять это каждый раз, когда открывается ящик, но желательно только один раз, потому что за ним стоит довольно тяжелый SQL-запрос. Я знаю, что могу использовать onDrawerOpened() а также onDrawerClosed(), но мне не нравится это решение, потому что номер будет обновляться внезапно, только когда ящик полностью открыт. Таким образом, он останется одним номером, пока не станет полностью открытым, и затем изменится. Это выглядит просто глупо. Вот почему я хотел бы изменить его один раз, когда навигационный ящик начинает открываться. Я не нашел приличных состояний, чтобы проверить это со слушателем, так как есть только STATE_IDLE, STATE_DRAGGING или же STATE_SETTLING и ничего не указывает, когда он открывается и закрывается, просто перетаскивая и устанавливая.

Кроме того, я также хотел бы сохранить заголовок фрагмента Context, чтобы он оставался "Context" и не менялся на "Context (2)". Что происходит в моем текущем коде:

mToggle = new ActionBarDrawerToggle(
            this,
            mDrawer,
            mToolbar,
            R.string.drawer_open,
            R.string.drawer_close
){
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            if (slideOffset != 0) {
                Log.i(TAG, "onDrawerSlide() in update amount");
                int amount = db.getAmountNoContext();
                String sourcestring = "Context <b>(" + amount + ")</b>";
                mNavigationView.getMenu().getItem(2).setTitle(Html.fromHtml(sourcestring));
            }
        }
};

Это работает для изменения заголовка меню в панели навигации, но также вызывается много раз подряд, потому что смещение постоянно меняется. И это из-за того, что SQL-запрос не идеален. Я также пытался установить его на конкретное значение с плавающей точкой, как 0.01, но это не срабатывает. Также я хотел бы напомнить, что я хотел бы изменить заголовок меню назад, когда ящик навигации закрыт, поэтому заголовок фрагмента в панели действий просто говорит "Контекст". Я провел свое исследование, но мне кажется, что у меня есть действительно конкретная проблема? Может, у кого-то из вас есть идея? Заранее спасибо.

1 ответ

Решение

На данный момент я "решил" свою проблему, просто используя логическое значение для отслеживания, если SQL-запрос уже выполнен. Если это так, то логическое значение установлено в true, и условие не будет введено снова, пока ящик не будет полностью закрыт с помощью onDrawerClosed() функция. Я буду делать это так, пока, возможно, кто-то другой не придумает лучшего решения Мое решение теперь выглядит так:

mToggle = new ActionBarDrawerToggle(
            this,
            mDrawer,
            mToolbar,
            R.string.drawer_open,
            R.string.drawer_close
){
        @Override
        public void onDrawerSlide(View drawerView, float slideOffset) {
            super.onDrawerSlide(drawerView, slideOffset);
            if (slideOffset != 0 && !contextUpdated) {
                int amount = db.getAmountNoContext();
                String sourcestring = "Context (" + amount + ")";
                NavigationView.getMenu().getItem(2).setTitle(Html.fromHtml(sourcestring));
                contextUpdated = true;
            }
        }

        @Override
        public void onDrawerClosed(View drawerView) {
            super.onDrawerClosed(drawerView);
            contextUpdated = false;
        }
};

Для изменения заголовка панели действий вернитесь к обычному заголовку без скобок. Я просто вручную установил заголовок в onCreateView() фрагмента, выполнив это:

Основная деятельность:

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

Фрагмент:

((MainActivity) getActivity()).setActionBarTitle("Context");
Другие вопросы по тегам