studio left hamburger ejemplo android android-fragments animation android-navigation-drawer

android - left - Manejar adecuadamente la animación DrawerLayout mientras navega a través del fragmento



navigation view android studio (2)

Actualmente estoy luchando con la animación DrawerLayout haciendo cosas raras; El ícono de la hamburguesa es lento y con frecuencia cambia de hamburguesa a flecha sin animación si no puse un Controlador para retrasar la animación de la transacción de fragment .

Así que terminé poniendo un controlador para esperar hasta que el ícono de la hamburguesa realice la animación, pero simplemente no parece natural que tengamos que esperar hasta que el cajón se cierre para cambiar el fragmento. Estoy seguro de que hay una mejor manera de manejar esto ...

Así es como lo hago actualmente:

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

Sigue fallando un poco entre la animación de transacción de fragmento y cierre de DrawerLayout .

Aquí está cómo instanciado el cajón:

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


Aquí está cómo puedes hacerlo. En la Actividad que contiene fragmento configura tu cajón.

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

Ahora en el NavigationDrawerFragment defina su método de configuración

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

Eso es todo, tu cajón está completamente arreglado.


No estoy seguro de qué causa este comportamiento, aunque quiero llamar su atención sobre algunas cosas.

  1. No sé qué clase de ActionBarDrawerToggle está utilizando, pero es preferible usar android.support.v7.app.ActionBarDrawerToggle lugar de android.support.v4.app.ActionBarDrawerToggle ya que está obsoleto.
  2. Use addDrawerListener() lugar de setDrawerListener() ya que está en desuso.
  3. Utilice spinBars y establezca el valor true para rotar las barras durante la transición. Ex en su styles.xml como se describe here .
  4. En onDrawerClosed y onDrawerOpened llame a syncState() . También llame a este método en su ActionBarDrawerToggle . Mira esto

    Espero que esto te ayudará.