18

我目前正在努力用DrawerLayout動畫做怪異的東西; 漢堡包圖標是laggy,並且如果我沒有讓Handler延遲fragment交易動畫,它通常會從沒有動畫的漢堡包切換到箭頭。正確處理DrawerLayout動畫,同時瀏覽片段

所以我結束了一個處理程序,直到漢堡包圖標執行動畫,但是我們不需要等到抽屜靠近切換片段時才感到不自然。我敢肯定有一個更好的辦法來處理這個......

這裏是我目前如何:

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); 
+1

我猜想BackHandledFragment的初始化有大量的處理。 改變BackHandledFragment's'onCreateView'和'onActivityCreated'簡單,並且延遲重處理。 – nshmura

+0

這不是問題,但因爲它只發生在配置文件片段... – Jaythaking

+1

對不起,我犯了一個錯誤。 FragmentUserProfile的初始化是否有重要的檢索? – nshmura

回答

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

    希望這會幫助你。

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; 
    } 

就是這樣,你的抽屜是完全的設置。

+0

isAdded()是什麼?我沒有跟着你,那該如何解決我的問題? – Jaythaking

+1

這是什麼是一個NavigationFragment?這種設置方法應該永遠不會離開活動。 –

+0

你必須從包含navigationFragment的活動調用setup()@EugenPechanec –