【问题标题】:Do action only ONCE when NavigationDrawer is OPENING当 NavigationDrawer 正在打开时,只执行一次操作
【发布时间】:2016-03-08 18:35:45
【问题描述】:

我已经为此寻找解决方案已有一段时间了。所以这就是我想要实现的目标。我有一个使用以下菜单实现的 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,并且没有指定何时打开和关闭,只是拖动和设置。

此外,我还希望将片段上下文的标题保留为“上下文”,而不是更改为“上下文 (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,但它没有被触发。另外我想提醒一下,当导航抽屉关闭时,我想将菜单标题改回来,所以 ActionBar 中的片段标题只是说“上下文”。我已经完成了我的研究,但似乎我只是有一个非常具体的问题?也许你们中的一个人有一个想法。提前致谢。

【问题讨论】:

    标签: android android-fragments navigation-drawer


    【解决方案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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多