我正在阅读关于导航抽屉的官方(且过时)样本的代码,您可以从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
仍然是假的。为什么呢?
我知道这是一个非常不寻常的问题,我只是想出了好奇心。
答案 0 :(得分:0)
问题1:要求mFromSavedInstanceState为假是什么意思?
您的活动可能会在配置更改时重新创建(如屏幕旋转),如果用户尚未了解其使用情况,此变量mFromSavedInstanceState
将阻止打开抽屉。
当mFromSavedInstanceState为false时,这是第一次在用户启动后立即调用onCreate方法。这是抽屉应该自动打开的情况,但是只有当用户没有手动打开它时(意味着学会了如何操作),这在mUserLearnedDrawer中会被记住。
问题2:
我完全不记得这段代码,但只有在用户手动明确打开抽屉后才应将mUserLearnedDrawer设置为true。它实际上是在onDrawerOpened中设置的。正如您可以看到在mDrawerLayout.openDrawer(mFragmentContainerView);
调用之前调用了最初的setDrawerListener
,因此只有在用户手动打开它之后,才会调用最初的onDrawerOpened。