不知道为什么这个代码*有效*

时间:2014-12-30 12:05:01

标签: android android-navigation

我正在阅读关于导航抽屉的官方(且过时)样本的代码,您可以从IDE轻松下载[在Android Studio中,如果您选择创建新的导航抽屉活动,则会自动导入]。

我真的很好奇为什么这实际上有效。这里的目标之一是在启动时打开抽屉,但前提是用户还没有学会如何滑动它。

所以 - 在创建抽屉时显示,您可以手动关闭它。无论如何你还没有了解它;代码要求您手动打开抽屉,至少一次,然后它将永远不会再出现。这是使用我知道的SharedPreferences和本地布尔值mUserLearnedDrawer来完成的。

我会发一些代码和我的问题。 它托管在将加载到抽屉中的片段类中。这里我们说mUserLearnedDrawer应该是在首选项中找到的,或者是false:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
    mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false);

     if (savedInstanceState != null) { mFromSavedInstanceState = true; }

在onCreate活动中,我们设置ActionBarDrawerToggle并致电:

   //..other stuff
        @Override
        public void onDrawerOpened(View drawerView) {
            super.onDrawerOpened(drawerView);
            if (!isAdded()) { return; }

            if (!mUserLearnedDrawer) {
                // The user manually opened the drawer; store this flag to prevent auto-showing
                // the navigation drawer automatically in the future.
                mUserLearnedDrawer = true;
                SharedPreferences sp = PreferenceManager
                        .getDefaultSharedPreferences(getActivity());
                sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).commit();
            }

            getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
        }
    };

    // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
    // per the navigation drawer design guidelines.
    if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
        mDrawerLayout.openDrawer(mFragmentContainerView);
    }
  • 问题1:要求mFromSavedInstanceState为假是什么意思?

  • 问题2:最后不应openDrawer()致电onDrawerOpened并设置mUserLearnedDrawer = true?这将使第一个自动抽屉打开被解释为用户滑入屏幕,而不是。事实上,这不会发生 - 在启动后出现的抽屉mUserLearnedDrawer仍然是假的。为什么呢?

我知道这是一个非常不寻常的问题,我只是想出了好奇心。

1 个答案:

答案 0 :(得分:0)

  

问题1:要求mFromSavedInstanceState为假是什么意思?

您的活动可能会在配置更改时重新创建(如屏幕旋转),如果用户尚未了解其使用情况,此变量mFromSavedInstanceState将阻止打开抽屉。

当mFromSavedInstanceState为false时,这是第一次在用户启动后立即调用onCreate方法。这是抽屉应该自动打开的情况,但是只有当用户没有手动打开它时(意味着学会了如何操作),这在mUserLearnedDrawer中会被记住。

  

问题2:

我完全不记得这段代码,但只有在用户手动明确打开抽屉后才应将mUserLearnedDrawer设置为true。它实际上是在onDrawerOpened中设置的。正如您可以看到在mDrawerLayout.openDrawer(mFragmentContainerView);调用之前调用了最初的setDrawerListener,因此只有在用户手动打开它之后,才会调用最初的onDrawerOpened。