【问题标题】:How to close navigation drawer immediately after an item is pressed?按下项目后如何立即关闭导航抽屉?
【发布时间】:2015-01-30 05:30:16
【问题描述】:

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

所以请帮忙解决这个问题

【问题讨论】:

  • 我没有编辑,当我问的时候提到了它。.Pela vachi ne bolta jav

标签: android navigation drawer


【解决方案1】:

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

首先我必须说我正在开发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(布局)工作

这是我自己的解决方案:

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) 移动到一个回调中,该回调只有在 Drawer 关闭后才会触发,然后我们强制 Drawer 关闭,这样魔法可能会发生。

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

【讨论】:

  • 旁注:当用户仅滑动关闭抽屉时,也会调用 onDrawerClosed。因此,您最好添加一个标志,使 selectItem() 仅在用户单击抽屉项目时调用。
【解决方案2】:

有closeDrawer(View view)和closerDrawer(int重力)。 在您的项目上单击 .closeDrawer(重力.START);

对我来说很好。他们也可能对你有帮助。

【讨论】:

  • 抽屉用此方法关闭但不顺畅
【解决方案3】:

在您的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;
    }

【讨论】:

    【解决方案4】:

    在您的项目上单击您必须关闭抽屉布局

    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();
        }
    }
    

    【讨论】:

    • 感谢您的回答,它与我的代码相同,但不是更好
    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多