导航抽屉在Android上滞后

AND*_*849 19 java android fragmenttransaction navigation-drawer

我遇到了导航抽屉的问题,它太慢了,我正在寻找的解决方案是首先关闭抽屉然后显示活动,但它不起作用,当然我错过了一些东西.

private class DrawerItemClickListener implements ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int posicao, long id) {
            setLastPosition(posicao);
            setFragmentList(lastPosition);
            layoutDrawer.closeDrawer(linearDrawer);
        }
    }

    private OnClickListener userOnClick = new OnClickListener() {
        @Override
        public void onClick(View v) {
            layoutDrawer.closeDrawer(linearDrawer);
        }
    };

    private void setFragmentList(int posicao) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = new FragmentViagens();

        switch (posicao) {

            case 0:
                fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit();
                break;
            case 1:
                fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentPedidos()).commit();
                break;
            case 2:
                fragmentManager.beginTransaction().replace(R.id.content_frame, new FragmentClientes()).commit();
                break;

        }

        navigationAdapter.setChecked(posicao, true);
        setTitleFragments(lastPosition);
        navigationAdapter.resetarCheck();
        layoutDrawer.closeDrawer(linearDrawer);

    }
Run Code Online (Sandbox Code Playgroud)

Yur*_*raj 37

您可以这样做以避免抽屉滞后,更改您的onItemClick:

layoutDrawer.closeDrawer(linearDrawer);
setLastPosition(posicao);
new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            setFragmentList(lastPosition);
        }
    }, 200);
Run Code Online (Sandbox Code Playgroud)

编辑:首选方式应该是在DrawerLayout上设置DrawerListener并onDrawerClosed 像这样设置你的片段:

Fragment mFragmentToSet = null;

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
    // Handle navigation view item clicks here.
    switch (item.getItemId()) {
        case R.id.nav_home:
            mFragmentToSet = HomeFragment.newInstance(); 
            break;
    }

    mDrawerLayout.closeDrawer(GravityCompat.START);
    return true;
}
Run Code Online (Sandbox Code Playgroud)
mDrawerLayout.addDrawerListener(new DrawerLayout.DrawerListener() {
        @Override public void onDrawerSlide(View drawerView, float slideOffset) {}
        @Override public void onDrawerOpened(View drawerView) {}
        @Override public void onDrawerStateChanged(int newState) {}

        @Override
        public void onDrawerClosed(View drawerView) {
          //Set your new fragment here
          if (mFragmentToSet != null) {
            getSupportFragmentManager()
                  .beginTransaction()
                  .replace(FRAGMENT_CONTAINER_ID, mFragmentToSet)
                  .commit();
            mFragmentToSet = null;
          }
        }
    });
Run Code Online (Sandbox Code Playgroud)


uDe*_*vel 20

而不是在onClick中执行事务,为什么不在DrawerLayout.DrawerListener的onDrawerClosed中执行此操作?


Que*_* G. 7

我想我找到了最好的解决方案!

首先像你这样做你的片段交易:

new Handler().post(new Runnable() {
                @Override
                public void run() {
                    getSupportFragmentManager()
                            .beginTransaction()
                            .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out)
                            .replace(R.id.container, finalMenuFragment)
                            .commit();
                }
            });
Run Code Online (Sandbox Code Playgroud)

我知道发布Runnable看起来没什么用处,但是这个hack避免了抽屉上点击动画的延迟,特别是当你使用 android:background="?attr/selectableItemBackground"可点击的元素时.

然后你关闭你的片段的onResume()函数的抽屉(在这个例子中它是"finalMenuFragment"),如下所示:

 new Handler().post(new Runnable() {
        public void run() {

            mDrawerLayout.closeDrawer(mFragmentContainerView);
        }
    });
Run Code Online (Sandbox Code Playgroud)

再次,我知道发布Runnable似乎很愚蠢,但它使得近距离动画变得平滑.

这样,如果您想要平滑的动画,抽屉将尽可能快地关闭,如果您的片段中没有很多视图,它将更快地关闭并且仍然没有滞后.

如果有人测试了这个解决方案,我希望得到一些反馈,希望它有所帮助!

  • 仅供参考:Handler#postDelayed(Runnable,0)相当于Handler#post(Runnable) (2认同)

小智 5

我只用One-Line解决了这个问题

转到你的Menifest文件在你的抽屉活动刚刚把HardwareAccelerated设置为true以防止打开抽屉的滞后

<activity
        android:name=".activity.YourDrawerActivity"
        android:configChanges="keyboardHidden|orientation"
        android:screenOrientation="portrait"
        android:hardwareAccelerated="true"  //important 
        android:theme="@style/AppTheme.NoActionBar"
        android:windowSoftInputMode="stateHidden" />
Run Code Online (Sandbox Code Playgroud)