当NavigationDrawer打开时,仅执行ONCE操作

时间:2016-03-07 15:54:23

标签: android android-fragments navigation-drawer android-navigation-drawer

我一直在寻找解决方案。所以这就是我想要实现的目标。我有一个使用以下菜单实现的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_IDLESTATE_DRAGGINGSTATE_SETTLING并且没有任何指定何时开启和关闭,只是拖动和沉降。

此外,我还想保留片段Context的标题以保持&#34; Context&#34;而且也不会改变为&#34; Context(2)&#34;。在我目前的代码中会发生这种情况:

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,但它没有被触发。另外我想提醒一下,我想在导航抽屉关闭时更改菜单标题,因此ActionBar中的片段标题只是说&#34; Context&#34;。我做了我的研究,但似乎我只是有一个非常具体的问题?也许你们其中一个人有个主意。提前谢谢。

1 个答案:

答案 0 :(得分:0)

我现在通过简单地使用布尔来“解决”我的问题,以便在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()中的标题:

MainActivity:

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

片段:

((MainActivity) getActivity()).setActionBarTitle("Context");