6

私は現在、Fragment指向アプリ (すべての s のホストとしてコンテナーをActivity持つアプリを持っています) をマテリアル デザインに更新しています。そして、を置き換えるときに、ハンバーガーアイコンを戻る矢印にアニメーション化したいと思います。FrameLayoutFragmentFragment

基本的に、これが十分に明確でない場合、これがが達成したいことです。私はこのライブラリ (MaterialMenu)を使用したくありません。公式のライブラリを可能な限り使用したいとAppCompat考えています。

この解決策のおかげでこの効果が得られましたが、 aが置き換えられたActionBarDrawerToggleときに戻るボタンにする方法がわかりません。Fragment

だから私の質問は次のとおりです。戻る矢印アイコンは、交換されActionBarDrawerToggleた後もそのままにする必要がありますか? その場合、ドロワーを開く代わりにFragement動作するようにオーバーライドするにはどうすればよいですか? onBackPressed()私はすでにこれを試しましたが、うまくいきません:

 @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        switch (item.getItemId())
        {
            case android.R.id.home:
                getActivity().onBackPressed();
                return true;
         }
         return false;
    }

前もって感謝します。

4

3 に答える 3

7

手動で開いたかどうかにかかわらず、引き出しのトグル内を追跡する方が少しきれいだと思います。これは私がやったことです:

public class ManualActionBarDrawerToggle extends ActionBarDrawerToggle {
    private static final float MENU_POSITION = 0f;
    private static final float ARROW_POSITION = 1.0f;

    private final int animationLength;
    private final DrawerLayout drawerLayout;
    private final Activity activity;
    private State currentState;

    private enum State { UP_ARROW, MENU }

    public ManualActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescriptionResource, int closeDrawerContentDescriptionResource) {
        super(activity, drawerLayout, openDrawerContentDescriptionResource, closeDrawerContentDescriptionResource);
        animationLength = activity.getResources().getInteger(android.R.integer.config_shortAnimTime);
        this.drawerLayout = drawerLayout;
        this.activity = activity;
        currentState = State.MENU;
    }

    public void animateToBackArrow() {
        ValueAnimator anim = ValueAnimator.ofFloat(MENU_POSITION, ARROW_POSITION);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float slideOffset = (Float) valueAnimator.getAnimatedValue();
            onDrawerSlide(drawerLayout, slideOffset);
            }
        });

        anim.setInterpolator(new DecelerateInterpolator());
        anim.setDuration(animationLength);
        anim.start();

        currentState = State.UP_ARROW;
    }

    public void animateToMenu() {
        ValueAnimator anim = ValueAnimator.ofFloat(ARROW_POSITION, MENU_POSITION);
        anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
                float slideOffset = (Float) valueAnimator.getAnimatedValue();
                onDrawerSlide(drawerLayout, slideOffset);
            }
        });

        anim.setInterpolator(new DecelerateInterpolator());
        anim.setDuration(animationLength);
        anim.start();

        currentState = State.MENU;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case (android.R.id.home):
                if (currentState == State.UP_ARROW) {
                    activity.onBackPressed();
                    return true;
                }
        }
        return super.onOptionsItemSelected(item);
    }
}
于 2015-01-28T22:04:33.787 に答える
1

わかりましたので、方法を考え出しました。ActionBarDrawerToggle作成された目的とは異なる目的で使用しているため、これは良い解決策ではないと確信しています。

しかし、それは機能するので、ここに私がやったことがあります。メソッドActionBarDrawerToggleをオーバーライドするカスタムを作成しただけです。onOptionsItemSelected(...)

class MyDrawerToggle extends ActionBarDrawerToggle
{
    // ... Default constructors matching super go here

    @Override
    public boolean onOptionsItemSelected(MenuItem item)
    {
        // If the back stack isn't empty, ie if I'm not in a Fragment 
        // accessible from the NavigationDrawer, I simulate the onBackPressed behaviour
        if (getFragmentManager().getBackStackEntryCount() != 0)
        {
            onBackPressed();
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

誰かがより良い解決策を持っている場合は、お気軽に提案してください。

于 2014-11-06T11:47:41.620 に答える