当前位置: 首页 > 知识库问答 >
问题:

配置更改时导航抽屉关闭

艾心远
2023-03-14

在我的片段中,我通过编程将片段添加到导航抽屉中,然后从右侧打开抽屉。注意,我无法直接访问抽屉布局的xml文件,因此需要一个编程解决方案。抽屉从右侧打开并正确关闭,我保留抽屉的打开/关闭状态,并在配置根据该状态更改后打开它。

问题是,在配置更改时,抽屉关闭(我可以看到抽屉动画到关闭状态),即使我根据保存的InstanceState布尔值恢复其打开/关闭状态。我在DrawerLayout.class中的所有CloseDrawer方法中放置了调试器,但它们没有被击中。

更新:我想我看到了问题所在,但我不知道如何在不扩展抽屉布局本身的情况下解决这个问题<代码>抽屉布局#findDrawerWithGravity,在本例中,它在抽屉布局#onRestoreInstanceState中调用,返回null。

@Override
public void onSaveInstanceState(Bundle outState)
{
    super.onSaveInstanceState(outState);
    outState.putBoolean(STATE_DRAWER_OPEN,
        getDrawerLayout() == null ? false : getDrawerLayout().isDrawerOpen(Gravity.RIGHT));
}

@Override
public void onActivityCreated(Bundle savedInstanceState)
{
    super.onActivityCreated(savedInstanceState);
    if (savedInstanceState != null)
        isDrawerOpen = savedInstanceState.getBoolean(STATE_DRAWER_OPEN);
}

private void setDrawer() //this is called in onCreate
{
    DrawerLayout drawer = getActivity().findViewById(R.id.drawer_layout);
    if (drawer == null)
        drawer = getDrawerLayout();

    View existing = drawer.findViewById(R.id.m_drawer_container);
    if (existing != null)
        drawer.removeView(existing);

    drawer.setFocusableInTouchMode(false);
    drawer.addDrawerListener(this);

    FrameLayout fragmentContainer = new FrameLayout(getActivity());
    fragmentContainer.setId(R.id.m_drawer_container);
    final DrawerLayout.LayoutParams layoutParams = new DrawerLayout.LayoutParams(
        getResources().getDimensionPixelSize(R.dimen.m_drawer_max_width),
        ViewGroup.LayoutParams.MATCH_PARENT, Gravity.RIGHT);
    drawer.addView(fragmentContainer, layoutParams);

    FragmentManager fragmentManager = getFragmentManager();
    MyDrawerFragment mDrawerFragment = null;
    Fragment frag = fragmentManager.findFragmentByTag(TAG_DRAWER_FRAGMENT);
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    if (frag != null && frag.isAdded())
        fragmentTransaction.remove(frag);
    mDrawerFragment = MyDrawerFragment.newInstance(myArgs);
    fragmentTransaction.add(R.id.m_drawer_container, drawerFragment, TAG_DRAWER_FRAGMENT);
    fragmentTransaction.commitAllowingStateLoss();

    if (isDrawerOpen)
        drawer.openDrawer(Gravity.RIGHT);
}

共有1个答案

锺离声
2023-03-14

结果,答案是调用drawer.open抽屉(重力。右,假);来禁用从配置更改恢复的动画。原因是调用drawer.open抽屉(重力。右)默认情况下动画设置为true,深入该方法最终会导致DrawerLayout.java中的此代码块,这会导致不正确的宽度计算,导致抽屉被“隐藏”:

抽屉布局。Java语言

else if (animate) {
    lp.openState |= LayoutParams.FLAG_IS_OPENING;

    if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
        mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop());
    } else {
        mRightDragger.smoothSlideViewTo(drawerView, getWidth() - drawerView.getWidth(),
                drawerView.getTop());
    }

解决方案是在从配置更改恢复时将animate设置为false。

if (isDrawerOpen && isRestoreFromConfigChange)
    drawer.openDrawer(Gravity.RIGHT, false);
 类似资料:
  • 我尝试在我的应用程序中实现导航抽屉(材料设计)。我的活动包含带有片段的FrameLayout。当用户在导航抽屉FrameLayout中选择项目时,重新加载新片段: 当我点击项目时,一切正常。导航抽屉关闭不顺利,但冻结(抽搐,抽搐),因为片段在后台重新加载。 如何顺利关闭导航抽屉?

  • 我知道如何改变抽屉图标,如果它在左侧,但我没有找到任何解决方案,改变导航抽屉汉堡图标,如果抽屉是在右侧。任何帮助都是可以感激的。

  • 我有一个主活动启动导航抽屉。 也有一些片段。 我需要从片段内部更改导航抽屉列表的标题。 我尝试了这个内部片段: 但是到目前为止还没有运气。这是我的主要活动: 在主活动类中使用相同的方法有效,但在片段中无效。我不知道如何更新字符串并通知抽屉此更改!

  • 有人能告诉我如何创建活动到这个主要活动,导航抽屉将看到在所有他们?我需要使用这个特定的MainActivity代码。我不需要使用碎片,只要3个简单的活动将添加到这个抽屉。 NavDrawer布局:

  • 问题内容: 我知道这些类型的问题已经在这里,但仍然找不到这个问题的答案: 我已经创建了一个应用程序,并使用了由该应用程序自动创建的导航抽屉(AndroidStudio) 这是我所拥有的: 还有更多: 我想使用导航抽屉中的按钮显示另一个片段。我想使用此代码,所以请不要向我发送任何制作自己的抽屉的指南或教程。 现在的问题是,我该怎么放 ,并在情况下,我想打开另一个片段?谢谢。 还有一个问题: 如何添加