2016-07-12 17 views
3

私はマスター/詳細フローを実装しました。フラグメントを追加した後(ハンガーハンマーアイコンからナビゲーションアイコンを開くときと同じアニメーション)、アニメーションをトランジションアニメーションにしたいと思います。フラグメント追加時のハンバーガーから矢印アイコンへの遷移

私は以下のようなコードを使用しています:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
    toggle = new ActionBarDrawerToggle(this, drawer, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    drawer.setDrawerListener(toggle); 
    toggle.setDrawerIndicatorEnabled(true); 
    toggle.syncState(); 

    //Add home page fragment 
    FragmentManager fragmentManager = getFragmentManager(); 
    HabitHomeFragment homePageFragment = new HabitHomeFragment(); 
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
    fragmentTransaction.replace(R.id.habit_home, homePageFragment); 
    fragmentTransaction.commit();} 

詳細フラグメントを追加する際:

public void showDetails() { 
     toggle.setDrawerIndicatorEnabled(false); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     fragmentTransaction.replace(R.id.habit_home, habitDetailsFragment).addToBackStack("detail").commit();} 

ツールバー:

<android.support.design.widget.AppBarLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:theme="@style/AppTheme.AppBarOverlay"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/toolbar" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     app:popupTheme="@style/AppTheme.PopupOverlay" /> 

</android.support.design.widget.AppBarLayout> 
....  

現在、フラグメントを変更した後、アイコンはアニメーションなしで変更されました。

+0

解決方法これまでに解決したことはありますか? – Questioner

+0

この問題の解決策は見つかりませんでした。 – user1030150

+0

@Questioner、私は2つの解決策を見つけました。答えを参照してください。 – babay

答えて

4

最初に説明します。

  1. android.support.v7.app.ActionBarDrawerToggleは、ハンバーガーから矢印アイコンおよびアニメーションに特殊な描画可能クラスを使用します。

  2. クラスはandroid.support.v7.graphics.drawable.DrawerArrowDrawable

  3. DrawerArrowDrawable進行は0〜1(ハンバーガー)(矢印)からのものである方法setProgress(float progress)とアニメーションを実装しています。

  4. ActionBarDrawerToggleはprivate void setPosition(float position)を使用していますDrawerArrowDrawable.setProgress()

  5. を呼び出すことActionBarDrawerToggleは、それが引き出しを切り替えるために使用されているリスナー、だとコンストラクタの民間setPosition()

  6. ActionBarDrawerToggle通話toolbar.setNavigationOnClickListener()を呼び出すためにpublic void onDrawerSlide(View drawerView, float slideOffset)を使用しています。

  7. ActionBarDrawerToggle実際のDrawerArrowDrawableの状態を保持します。 ToolbarActionBarは実際のDrawerArrowDrawableの状態をトラッキングしません。

あなたは何をすべきですか。オプション-A、ActionBarDrawerToggleを使用します。

// define a variable to track hamburger-arrow state 
    protected boolean isHomeAsUp = false; 

    protected DrawerLayout drawer; 
    protected Toolbar toolbar; 
    protected ActionBarDrawerToggle toggle; 

    // I've implemented it in setContentView(), but you can implement it in onCreate() 
    @Override 
    public void setContentView(@LayoutRes int layoutResID) { 
     super.setContentView(layoutResID); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 
     toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.drawer_open, R.string.drawer_close); 
     drawer.addDrawerListener(toggle); 
     toggle.syncState(); 

     // overwrite Navigation OnClickListener that is set by ActionBarDrawerToggle 
     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (drawer.isDrawerOpen(GravityCompat.START)){ 
        drawer.closeDrawer(GravityCompat.START); 
       } else if (isHomeAsUp){ 
        onBackPressed(); 
       } else { 
        drawer.openDrawer(GravityCompat.START); 
       } 
      } 
     }); 
    } 

    // call this method for animation between hamburged and arrow 
    protected void setHomeAsUp(boolean isHomeAsUp){ 
     if (this.isHomeAsUp != isHomeAsUp) { 
      this.isHomeAsUp = isHomeAsUp; 

      ValueAnimator anim = isHomeAsUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0); 
      anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator valueAnimator) { 
        float slideOffset = (Float) valueAnimator.getAnimatedValue(); 
        toggle.onDrawerSlide(drawer, slideOffset); 
       } 
      }); 
      anim.setInterpolator(new DecelerateInterpolator()); 
      // You can change this duration to more closely match that of the default animation. 
      anim.setDuration(400); 
      anim.start(); 
     } 
    } 

それともtoolbar.setNavigationIcon()で、ナビゲーションアイコンとしてDrawerArrowDrawableを設定し、ActionBarDrawerToggle 参照オプション-Bなしでそれをアニメーション化することができますhttps://stackoverflow.com/a/42024138/1148784

3

は説明https://stackoverflow.com/a/42023946/1148784のための私の別の答えを参照してください。これはオプションBです。 Activityクラスのコード。 ActionBarDrawerToggleはここでは使用しません。

protected boolean isHomeAsUp = false; 
    DrawerArrowDrawable homeDrawable; 
    protected Toolbar toolbar; 
    protected DrawerLayout drawer; 

    @Override 
    public void setContentView(@LayoutRes int layoutResID) { 
     super.setContentView(layoutResID); 

     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     drawer = (DrawerLayout) findViewById(R.id.drawer_layout); 

     homeDrawable = new DrawerArrowDrawable(toolbar.getContext()); 
     toolbar.setNavigationIcon(homeDrawable); 

     toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (drawer.isDrawerOpen(GravityCompat.START)){ 
        drawer.closeDrawer(GravityCompat.START); 
       } else if (isHomeAsUp){ 
        onBackPressed(); 
       } else { 
        drawer.openDrawer(GravityCompat.START); 
       } 
      } 
     }); 
    } 

    protected void setHomeAsUp(boolean isHomeAsUp){ 
     if (this.isHomeAsUp != isHomeAsUp) { 
      this.isHomeAsUp = isHomeAsUp; 
      ValueAnimator anim = isHomeAsUp ? ValueAnimator.ofFloat(0, 1) : ValueAnimator.ofFloat(1, 0); 
      anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
       @Override 
       public void onAnimationUpdate(ValueAnimator valueAnimator) { 
        float slideOffset = (Float) valueAnimator.getAnimatedValue(); 
        homeDrawable.setProgress(slideOffset); 
       } 
      }); 
      anim.setInterpolator(new DecelerateInterpolator()); 
      anim.setDuration(400); 
      anim.start(); 
     } 
    } 
関連する問題