Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 导航抽屉在配置更改时关闭_Android_Drawerlayout_Navigation Drawer - Fatal编程技术网

Android 导航抽屉在配置更改时关闭

Android 导航抽屉在配置更改时关闭,android,drawerlayout,navigation-drawer,Android,Drawerlayout,Navigation Drawer,在我的片段中,我以编程方式将片段添加到导航抽屉中,然后从右侧打开抽屉。请注意,我无法直接访问抽屉布局的xml文件,因此需要编程解决方案。抽屉从右侧打开并正确关闭,我保留抽屉的打开/关闭状态,并根据该状态更改配置后将其打开 问题是,在配置更改时,抽屉关闭(我可以看到抽屉动画显示为关闭状态),即使我根据savedInstanceState布尔值恢复其打开/关闭状态。我在DrawerLayout.class中的所有closeDrawer方法中放置了一个调试器,但它们没有被命中 更新:我想我看到了问题所

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

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

更新:我想我看到了问题所在,但我不确定如何在不扩展抽屉布局的情况下解决这个问题<代码>抽屉布局#findDrawerWithGravity在
DrawerLayout#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);
}

原来答案是调用
drawer.openDrawer(Gravity.RIGHT,false)在从配置更改恢复时禁用动画。原因是调用
drawer.openDrawer(Gravity.RIGHT)
默认情况下会将动画设置为true,深入研究该方法最终会导致
DrawerLayout.java
中的这段代码,这会导致不正确的宽度计算,导致抽屉被“隐藏”:

DrawerLayout.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);

原来答案是调用
drawer.openDrawer(Gravity.RIGHT,false)在从配置更改恢复时禁用动画。原因是调用
drawer.openDrawer(Gravity.RIGHT)
默认情况下会将动画设置为true,深入研究该方法最终会导致
DrawerLayout.java
中的这段代码,这会导致不正确的宽度计算,导致抽屉被“隐藏”:

DrawerLayout.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);