Действовать только ОДИН РАЗ, когда 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");