18

我目前正在努力用DrawerLayout动画做怪异的东西; 汉堡包图标是laggy,并且如果我没有让Handler延迟fragment交易动画,它通常会从没有动画的汉堡包切换到箭头。正确处理DrawerLayout动画,同时浏览片段

所以我结束了一个处理程序,直到汉堡包图标执行动画,但是我们不需要等到抽屉靠近切换片段时才感到不自然。我敢肯定有一个更好的办法来处理这个......

这里是我目前如何:

private void selectProfilFragment() { 
    final BackHandledFragment fragment; 
    // TODO test this again 
    Bundle bundle = new Bundle(); 
    bundle.putString(FragmentUserProfile.USER_FIRST_NAME, user.getFirstname()); 
    bundle.putString(FragmentUserProfile.USER_LAST_NAME, user.getLastname()); 
    bundle.putString(FragmentUserProfile.USER_PICTURE, user.getProfilepic()); 
    bundle.putString(FragmentUserProfile.USER_EMAIL, user.getEmail()); 
    bundle.putBoolean(FragmentUserProfile.USER_SECURITY, user.getParameters().getSecuritymodule().equals("YES")); 
    fragment = new FragmentUserProfile(); 
    fragment.setArguments(bundle); 
    mDrawerLayout.closeDrawer(mDrawerLinear); 

    new Handler().postDelayed(new Runnable() { 
     public void run() { 
      FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
      ft.setCustomAnimations(R.anim.pull_in_right, R.anim.push_out_left, R.anim.pull_in_left, R.anim.push_out_right); 
      ft.replace(R.id.content_frame, fragment) 
        .addToBackStack(fragment.getTagText()) 
        .commitAllowingStateLoss(); 
     } 
    }, 300); 
} 

它仍然毛刺DrawerLayout关闭和打开之间的一点点片段交易动画。

这里是我如何实例化抽屉:

mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 

mDrawerListChild.setAdapter(new DrawerListAdapter(this, R.layout.drawer_layout_item, mPlanTitles)); 
mDrawerListChild.setOnItemClickListener(new DrawerItemClickListener()); 

mProfilPic.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     selectProfilFragment(); 
    } 
}); 

mDrawerToggle = new ActionBarDrawerToggle(
     this, 
     mDrawerLayout, 
     toolbar, 
     R.string.drawer_open, 
     R.string.drawer_close 
) { 
    public void onDrawerClosed(View view) { 
     invalidateOptionsMenu(); 
    } 

    public void onDrawerOpened(View drawerView) { 
     invalidateOptionsMenu(); 
    } 
}; 
getSupportFragmentManager().addOnBackStackChangedListener(mOnBackStackChangedListener); 
mDrawerLayout.setDrawerListener(mDrawerToggle); 
setSupportActionBar(toolbar); 
+1

我猜想BackHandledFragment的初始化有大量的处理。 改变BackHandledFragment's'onCreateView'和'onActivityCreated'简单,并且延迟重处理。 – nshmura

+0

这不是问题,但因为它只发生在配置文件片段... – Jaythaking

+1

对不起,我犯了一个错误。 FragmentUserProfile的初始化是否有重要的检索? – nshmura

回答

2

我不确定是什么导致了这种行为,虽然我想提请你注意几件事情。

  1. 我不知道你正在使用ActionBarDrawerToggle类,但最好使用android.support.v7.app.ActionBarDrawerToggle,而不是android.support.v4.app.ActionBarDrawerToggle,因为它已经过时了。
  2. 使用addDrawerListener()而不是setDrawerListener(),因为它已被弃用。
  3. 使用spinBars和设定值true在转换期间旋转条。 e.x.在您的styles.xml中,如here所述。
  4. onDrawerClosedonDrawerOpened请致电syncState()。请在您的ActionBarDrawerToggle上调用此方法。 Check this

    希望这会帮助你。

2

继承人你如何能做到这一点。在包含片段的活动中设置您的抽屉。

public void setupDrawer(){ 
NavigationFragment drawerFragment = (NavigationFragment) 
       getSupportFragmentManager().findFragmentById(R.id.navigation_drawer); 
     mActionbarToggle = drawerFragment.setUp(R.id.navigation_drawer, mDrawerLayout, mToolbar); 
} 

现在在NavigationDrawerFragment定义的setUp方法

public ActionBarDrawerToggle setUp(int navigation_drawer, DrawerLayout drawerLayout, Toolbar mToolbar) { 
     mFragmentContainerView = getActivity().findViewById(navigation_drawer); 
     this.mDrawerLayout = drawerLayout; 
     //mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); 
     ActionBar actionBar = getActionBar(); 
     actionBar.setDisplayHomeAsUpEnabled(true); 
     actionBar.setHomeButtonEnabled(true); 
     mDrawerToggle = new ActionBarDrawerToggle(getActivity(), drawerLayout, mToolbar, R.string.drawer_open, R.string.drawer_close) { 
      @Override 
      public void onDrawerClosed(View drawerView) { 
       super.onDrawerClosed(drawerView); 
       if (!isAdded()) { 
        return; 
       } 
       getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
      } 

      @Override 
      public void onDrawerOpened(View drawerView) { 
       super.onDrawerOpened(drawerView); 
       if (!isAdded()) { 
        return; 
       } 
       getActivity().supportInvalidateOptionsMenu(); // calls onPrepareOptionsMenu() 
      } 
     }; 
     mDrawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       ((MainActivity) mContext).onBackPress(); 
      } 
     }); 
     mDrawerLayout.post(new Runnable() { 
      @Override 
      public void run() { 
       mDrawerToggle.syncState(); 
      } 
     }); 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 

     return mDrawerToggle; 
    } 

就是这样,你的抽屉是完全的设置。

+0

isAdded()是什么?我没有跟着你,那该如何解决我的问题? – Jaythaking

+1

这是什么是一个NavigationFragment?这种设置方法应该永远不会离开活动。 –

+0

你必须从包含navigationFragment的活动调用setup()@EugenPechanec –