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

时间:2015-01-30 05:30:17

标签: android navigation drawer

我正在使用导航抽屉正常工作,但在按下一个项目后它会慢慢关闭。如果下一个活动在oncreate方法中有额外的代码,否则正常工作会发生这种情况。

所以请帮助解决这个问题

4 个答案:

答案 0 :(得分:2)

我刚刚设法解决了您遇到的问题。

首先,我必须说我正在开发 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;
}

单击项目时

  

mDrawerListView.setOnItemClickListener()

回叫将触发,然后球传递给

  

选择信息(位置)

方法

“selectItem()”方法隐藏了NavigationDrawer,并使用回调将方法调用到“MainActivity”类 - onNavigationDrawerItemSelected() - ,开始转换到所选片段

动画卡顿/滞后是因为代码试图关闭NavigationDrawer并同时完成UI布局核心作业。

如果你想避免滞后,你必须先选择做什么。

在我自己的解决方法中,我决定:

  1. 关闭NavigationDrawer
  2. 完成UI(布局)工作
  3. 这是我自己的解决方案:

    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 :(得分:0)

有closeDrawer(View视图)和closerDrawer(int gravity)。 在您的项目上单击 .closeDrawer(Gravity.START);

对我来说是罚款。他们也可能对你很有帮助。

答案 2 :(得分: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;
    }

答案 3 :(得分: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();
    }
}