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.
- No sé qué clase de
ActionBarDrawerToggle
está utilizando, pero es preferible usarandroid.support.v7.app.ActionBarDrawerToggle
lugar deandroid.support.v4.app.ActionBarDrawerToggle
ya que está obsoleto. - Use
addDrawerListener()
lugar desetDrawerListener()
ya que está en desuso. - Utilice spinBars y establezca el valor
true
para rotar las barras durante la transición. Ex en su styles.xml como se describe here . En
onDrawerClosed
yonDrawerOpened
llame a syncState() . También llame a este método en suActionBarDrawerToggle
. Mira estoEspero que esto te ayudará.