首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在浏览片段时正确处理DrawerLayout动画

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

Stack Overflow用户
提问于 2016-08-05 23:17:29
回答 2查看 1.2K关注 0票数 19

我目前正在为DrawerLayout动画做一些奇怪的事情而苦苦挣扎;如果我不使用Handler来延迟fragment事务动画,汉堡图标就会变得迟缓,并且经常在没有动画的情况下从汉堡切换到箭头。

因此,我最终让一个处理程序等待,直到汉堡图标执行动画,但我们需要等待,直到抽屉接近开关碎片,这感觉很不自然。我相信有更好的方法来处理这件事...

下面是我目前所做的

代码语言:javascript
复制
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关闭和打开片段事务动画之间,它仍然有一点小问题。

我是如何实例化这个抽屉的:

代码语言:javascript
复制
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);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-03 22:52:10

我不确定是什么导致了这种行为,尽管我想在几件事上引起你的注意。

  1. 我不知道您使用的是哪个ActionBarDrawerToggle类,但最好使用android.support.v7.app.ActionBarDrawerToggle而不是android.support.v4.app.ActionBarDrawerToggle,因为它已被弃用。

  1. 使用addDrawerListener()而不是setDrawerListener(),因为它已被弃用。

在变换过程中,

  1. 使用spinBars和set value true来旋转条。e.x。在如here.

所述的styles.xml

onDrawerClosedonDrawerOpened中的

  1. 调用syncState()。也可以在ActionBarDrawerToggle上调用此方法。Check this

希望这能对你有所帮助。

票数 3
EN

Stack Overflow用户

发布于 2016-08-17 17:29:05

下面是你如何做到这一点。在包含片段的活动中设置您的抽屉。

代码语言:javascript
复制
public void setupDrawer(){
 NavigationFragment drawerFragment = (NavigationFragment)
                getSupportFragmentManager().findFragmentById(R.id.navigation_drawer);
        mActionbarToggle = drawerFragment.setUp(R.id.navigation_drawer, mDrawerLayout, mToolbar); 
}

现在在NavigationDrawerFragment中定义您的setUp方法

代码语言:javascript
复制
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;
    }

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38792675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档