Подтвердить что ты не робот

Правильно обрабатывать анимацию DrawerLayout при навигации по фрагменту

Я сейчас борется с анимацией DrawerLayout, делающей странные вещи; Значок гамбургера отстает и часто переключается с гамбургера на стрелку без анимации, если я не помещаю обработчика для задержки анимации транзакций fragment.

Итак, я закончил работу с обработчиком, чтобы ждать, пока значок гамбургера не выполнит анимацию, но просто не кажется естественным, что нам нужно подождать, пока ящик не приблизится к фрагменту фрагмента. Я уверен, что есть лучший способ справиться с этим...

Вот как я сейчас делаю:

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

Ответ 1

Я не уверен, что вызывает подобное поведение, хотя я хочу обратить ваше внимание на несколько вещей.

  • Я не знаю, какой класс ActionBarDrawerToggle вы используете, но предпочитаете использовать android.support.v7.app.ActionBarDrawerToggle вместо android.support.v4.app.ActionBarDrawerToggle, поскольку он устарел.
  • Используйте addDrawerListener() вместо setDrawerListener(), поскольку он устарел.
  • Используйте spinBars и установите значение true для поворота полос во время перехода. e.x. в styles.xml, как описано здесь.
  • В onDrawerClosed и onDrawerOpened вызовите syncState(). Также вызовите этот метод на ActionBarDrawerToggle. Проверьте это.

    Надеюсь, это поможет вам.

Ответ 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;
    }

Что это, ваш ящик полностью установлен.