在浏览片段时正确处理DrawerLayout动画

时间:2016-08-05 15:17:29

标签: android android-fragments animation android-navigation-drawer

我目前正在努力使用Owner.Name动画制作奇怪的东西; 汉堡包图标是滞后的,如果我没有让Handler延迟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

2 个答案:

答案 0 :(得分: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;
    }

那就是它,你的抽屉是完全设置的。

答案 1 :(得分: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

    希望这会对你有所帮助。