如何在按下项目后立即关闭导航抽屉?

3
我正在使用导航抽屉功能,正常工作,但在点击一项后关闭速度较慢。如果下一个活动在oncreate方法中有额外的代码,则会出现此问题,否则可以正常使用。

请帮助解决此问题。


我没有编辑过,当我问的时候就被提到了。Pela vachi ne bolta jav。 - RAVI VAGHELA
4个回答

3

我刚刚成功解决了你遇到的问题。

首先,我要说的是我正在使用 Android Studio 1.1.0 生成的 NavigationDrawer 项目。

下面是 NavigationDrawerFragment 类中的 onCreateView() 方法。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
{
    mDrawerListView = (ListView) inflater.inflate(
            R.layout.fragment_navigation_drawer, container, false);

    mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
    {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
        {
            selectItem(position);
        }
    });

    mDrawerListView.setAdapter(new ArrayAdapter<String>(
            getActionBar().getThemedContext(),
            android.R.layout.simple_list_item_activated_1,
            android.R.id.text1,
            new String[]{
                    getString(R.string.title_section1),
                    getString(R.string.title_section2),
                    getString(R.string.title_section3),
            }));

    mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);

    return mDrawerListView;
}

当点击Item时,

mDrawerListView.setOnItemClickListener()

回调函数将被触发并且控制权将传递给

selectItem(position)

方法。

"selectItem()"方法会隐藏导航抽屉,并使用回调调用"MainActivity"类中的一个方法-onNavigationDrawerItemSelected(),该方法启动切换到所选片段的过渡。

动画卡顿/延迟是由于代码尝试同时关闭导航抽屉和完成UI布局工作。

如果您想避免延迟,您必须选择先执行哪个任务。

在我的解决方案中,我决定:

  1. 关闭导航抽屉
  2. 完成UI(布局)工作

这是我的解决方案:

mDrawerListView.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id)
    {
        final int pos = position;

        mDrawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener(){
            @Override
            public void onDrawerClosed(View drawerView)
            {
                super.onDrawerClosed(drawerView);
                selectItem(pos);
            }
        });

        mDrawerLayout.closeDrawer(mFragmentContainerView);
    }
});

不要被代码搞混了。

我们将selectItem(pos)放在一个回调函数中,该回调函数仅在抽屉关闭时触发,然后我们强制关闭抽屉,以便魔法发生。

这个解决方案对我有用,希望知道它是否也适用于你。


1
附注:当用户仅滑动关闭抽屉时,onDrawerClosed也将被调用。因此,最好添加一个标志,使selectItem()仅在用户单击抽屉项时才被调用。 - Dark Leonhart

0
在你的displayView()中,你可以从抽屉中获取所选项目,因此你可以指定mDrawerLayout的重力方向。
     private void displayView(int position) {
                // update the main content by replacing fragments
                Fragment fragment = null;
                switch (position) {
                case 0:
                    //load your fragment here
                    mDrawerLayout.closeDrawer(Gravity.LEFT);


                    break;
    }

0

在您的项目点击事件中,您需要关闭抽屉布局

drawlayout = (DrawerLayout) findViewById(R.id.drawer_layout);

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    // TODO Auto-generated method stub
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        break;

    case 1:
        fragment = new EventFragment();
        break;

    case 2:
        fragment = new SponsorsFragment();
        break;

    case 3:
        fragment = new AboutFragment();
        break;

    case 4:
        fragment = new OurTeamFragment();
        break;

    case 5:
        fragment = new VideoFragment();
        break;

    case 6:
        fragment = new ContactFragment();
        break;

    default:
        break;
    }
    if (fragment != null) {
        FragmentTransaction ft = getSupportFragmentManager()
                .beginTransaction();
        ft.setCustomAnimations(android.R.anim.slide_in_left,
                android.R.anim.slide_out_right);
        ft.replace(R.id.content_frame, fragment);
        ft.commit();
        // pushFragments(fragment, true, true);

        drawlayout.closeDrawers();
    }
}

谢谢回答,这和我的代码一样,但不是更好的。 - RAVI VAGHELA

0

有 closeDrawer(View view) 和 closerDrawer(int gravity) 两个方法。 在你的项目点击事件中, 可以使用 .closeDrawer(Gravity.START); 来关闭抽屉。

对我来说,这些方法都很有效。它们也可能对你有帮助。


抽屉使用此方法关闭,但不够平滑。 - RAVI VAGHELA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接