2014-11-25 1 views
29

햄버거에서 뒤로 화살표 애니메이션까지 Toolbar을 구현하는 것은 매우 쉽습니다. 내 생각에이 애니메이션은 물질 디자인 스펙 네비게이션 서랍이 열릴 때 Toolbar을 커버하기 때문에 무의미합니다. 내 질문에 제대로 내가 그것을 어떻게 이것은 getSupportActionBar().setDisplayHomeAsUpEnabled(true);툴바에서 햄버거를 뒤로 화살표 애니메이션으로 사용 중지합니다.

사용하여이 애니메이션을 해제하고 햄버거 하나를 표시하거나 뒤로 화살표를하는 방법이지만, 그것은 더러운 해킹과 같습니다

mDrawerToggle.setDrawerIndicatorEnabled(false); 

if (showHomeAsUp) { 
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.lib_ic_arrow_back_light); 
    mDrawerToggle.setToolbarNavigationClickListener(view -> finish()); 
} else { 
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.lib_ic_menu_light); 
    mDrawerToggle.setToolbarNavigationClickListener(view -> toggleDrawer()); 
} 

모든 단서는이 어떻게해야 햄머와 뒤로 화살표 아이콘 사이를 전환하기 위해 setDisplayHomeAsUpEnabled을 사용하도록 올바르게 구현 되었습니까?

답변

1

onDrawerSlide() 메서드에서 저녁 식사 호출을 비활성화하면 Arrow와 Burger 간의 애니메이션이 중단됩니다. 서랍이 완전히 열려 있거나 완전히 닫혀있을 때만 애니메이션이없는 전환이 표시됩니다. 제 생각에는

mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.open, R.string.closed) { 
      @Override 
      public void onDrawerSlide(View drawerView, float slideOffset) { 
        //super.onDrawerSlide(drawerView, slideOffset); 
      } 
     }; 
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle); 
+0

을하지만 뒤로 화살표는 화면 회전 후 볼 수 있습니다. 서랍을 열고, 화면을 회전하고, 서랍을 닫습니다. 햄버거가 아닌 뒤쪽 화살표가 보입니다. – tomrozb

+0

재현 할 수 없습니다. 다른 코드가이 사건과 관련이있는 것 같습니다. –

+0

onDrawerOpened/Closed에서 onPostCreate에서 mDrawerToggle.syncState()를 호출하고 invalidateOptionsMenu()를 호출합니다. 당신은 또한이 방법들을 부릅니까? – tomrozb

13

이 애니메이션은

잘 무의미, ActionBarDrawerToggle은 애니메이션하기위한 것입니다.

From the docs:

당신은 당신의 액션 바 테마에 drawerArrowStyle를 정의하여 애니메이션 전환을 사용자 정의 할 수 있습니다

.

이 제대로 단지 햄버거 사이를 전환하고 다시 아이콘, 화살표 setDisplayHomeAsUpEnabled 사용하여 구현하는 방법을 모든 단서?

ActionBarDrawerToggle은 단지 ActionBar.setHomeAsUpIndicator을 호출하는 멋진 방법 일뿐입니다. 따라서 어느 쪽이든 ActionBar.setDisplayHomeAsUpEnabledtrue으로 불러 와서 표시해야합니다.

당신이 그것을 사용해야한다고 확신한다면, 각각 ActionBarDrawerToggle.onDrawerOpened(View drawerView)ActionBarDrawerToggle.onDrawerClosed(View drawerView)을 각각 호출하는 것이 좋습니다.

이 화살표와 DrawerArrowDrawable의 햄버거 상태 사이에서 전환 1 또는 0DrawerIndicator 위치를 설정한다.

귀하의 경우에는 ActionBarDrawerToggleDrawerLayout.DrawerListener으로 첨부 할 필요가 없습니다. 마찬가지로 :

mYourDrawer.setDrawerListener(mYourDrawerToggle); 

그러나 훨씬 더 앞으로 접근 방식은 한 번 ActionBar.setHomeAsUpIndicator를 호출하고 자신의 햄버거 아이콘을 적용하는 것입니다, 당신은 또한 스타일을 통해이 작업을 수행 할 수 있습니다. 그런 다음 뒤로 화살표를 표시하려면 ActionBar.setDisplayHomeAsUpEnabled을 호출하고 AppCompat 또는 프레임 워크가 나머지를 처리하게하십시오. 당신이 만든 코멘트에서, 나는 이것이 당신이 찾고있는 것이라고 확신합니다.Google의 공식 소재 디자인 아이콘 팩의 navigation icon set에서 ic_menu_white_24dp 또는 ic_menu_black_24dp을 잡고 싶어 의미

사용할 아이콘을 모를 경우, the default DrawerArrowDrawable size is 24dp.

DrawerArrowDrawable을 프로젝트에 복사 한 다음 필요에 따라 화살표 또는 햄버거 상태를 토글 할 수도 있습니다. 그것은 자급 자족하고 약간의 자원을 뺀 것입니다.

+3

아마도 ActionBarDrawerToggle은 애니메이션으로 제작 될 예정이지만 재질 디자인 규칙을 따르는 Google의 앱을 보면이 애니메이션이 사용 중지됩니다. 서랍을 열거 나 닫을 때 액션 버튼의 가시성이 변경되어야하기 때문에 서랍 수신기가 필요합니다. 이미 ic_menu_white_24dp 리소스 (다른 이름)를 사용하고 있습니다. 자신의 리소스 아이콘을 설정하면 setDisplayHomeAsUpEnabled 메소드가 더 이상 작동하지 않습니다. 뒤로 화살표를 표시하려면 아이콘을 lib_ic_arrow_back_light로 바꿔야합니다. 미안하지만 귀하의 답변을 읽은 후에 나는 여전히 진실 또는 거짓으로 설정된 매개 변수를 모른다. – tomrozb

+1

감사합니다. 실제로 프레임 워크 스타일과 일치하지 않을 수도있는 사용자 정의 리소스를 제공 할 필요가 없기 때문에 실제로 대답의 첫 번째 제안을 선호합니다. –

+0

@tomrozb 아, 알겠습니다. 사실, 당신은'ActionBar.setHomeAsUpIndicator'를 호출하여 원하는 아이콘을 표시해야합니다. 그래서 햄버거와 뒤로 화살표 리소스를 스왑 아웃하고,'DrawerArrowDrawable'를 복사하여 그릴 수있게하거나'ActionBarDrawerToggle '을 호출하십시오. onDrawerOpened', 등 내가 언급 한. 당신은 구글의 앱이 실제로'ActionBarDrawerToggle'을 사용하고 있음을 암시하고 있지만, 그렇지 않을 수도 있습니다. – adneal

3

비슷한 요구 사항이있어서 얼마간 ActionBarDrawerToggle 코드를 사용했습니다. 현재 갖고있는 것이 최선의 방법입니다.

가 와서 :

애니메이션을 화살표로 햄버거 그릴 수 구현에 의해 제공됩니다 - DrawerArrowDrawableToggle합니다. 현재 우리는이 드로어 블이 서랍 상태에 어떻게 반응하는지에 대해 많은 통제력을 가지고 있지 않습니다. 여기 actionVarDrawerToggle의 패키지 액세스 생성자의 말씀입니다 :

/** 
* In the future, we can make this constructor public if we want to let developers customize 
* the 
* animation. 
*/ 
<T extends Drawable & DrawerToggle> ActionBarDrawerToggle(Activity activity, Toolbar toolbar, 
     DrawerLayout drawerLayout, T slider, 
     @StringRes int openDrawerContentDescRes, 
     @StringRes int closeDrawerContentDescRes) 

slider의 자신의 구현을 제공함으로써, 당신은 상태를 서랍에 반응하는 방법을 제어 할 수 있습니다. - 모든 서랍 상태 변화가 서랍 표시를 업데이트를 호출

/** 
* Interface for toggle drawables. Can be public in the future 
*/ 
static interface DrawerToggle { 

    public void setPosition(float position); 

    public float getPosition(); 
} 

setPosition(float) 여기에 하이라이트 : slider이 구현해야하는 인터페이스입니다.

원하는 동작을 위해 slider 구현의 setPosition(float position)은 아무 작업도 수행하지 않습니다.

당신은 여전히 ​​필요합니다

if (showHomeAsUp) { 
    mDrawerToggle.setDrawerIndicatorEnabled(false); 
    // Can be set in theme 
    mDrawerToggle.setHomeAsUpIndicator(R.drawable.lib_ic_arrow_back_light); 
    mDrawerToggle.setToolbarNavigationClickListener(view -> finish()); 
} 

setDrawerIndicatorEnabled(false), 당신은 setToolbarNavigationClickListener(view -> finish()); 설정 한 OnClickListener가 발생하지 않습니다되지는 않는 경우.

우리가 할 수있는 일은 무엇입니까 지금?

더 자세히 살펴보면 귀하의 요구 사항이 ActionBarDrawerToggle 인 것으로 나타났습니다. 나는이 조항이 당신이 현재 가지고있는 것보다 훨씬 더 많은 해킹을 발견합니다. 하지만, 내가 결정하게 할께.

ActionBarDrawerToggleDelegate을 통해 서랍 표시기를 통해 일부를 제어 할 수 있습니다. 당신은 당신의 활동이 다음과 같은 방식으로이 인터페이스를 구현할 수 있습니다 :

public class TheActivity extends ActionBarActivity implements ActionBarDrawerToggle.Delegate { 
.... 

    @Override 
    public void setActionBarUpIndicator(Drawable drawableNotUsed, int i) { 

     // First, we're not using the passed drawable, the one that animates 

     // Second, we check if `displayHomeAsUp` is enabled 
     final boolean displayHomeAsUpEnabled = (getSupportActionBar().getDisplayOptions() 
      & ActionBar.DISPLAY_HOME_AS_UP) == ActionBar.DISPLAY_HOME_AS_UP; 

     // We'll control what happens on navigation-icon click 
     mToolbar.setNavigationOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (displayHomeAsUpEnabled) { 
        finish(); 
       } else { 
        // `ActionBarDrawerToggle#toggle()` is private. 
        // Extend `ActionBarDrawerToggle` and make provision 
        // for toggling. 
        mDrawerToggle.toggleDrawer(); 
       } 
      } 
     }); 

     // I will talk about `mToolbarnavigationIcon` later on. 

     if (displayHomeAsUpEnabled) { 
      mToolbarNavigationIcon.setIndicator(
          CustomDrawerArrowDrawable.HOME_AS_UP_INDICATOR); 
     } else { 
      mToolbarNavigationIcon.setIndicator(
          CustomDrawerArrowDrawable.DRAWER_INDICATOR); 
     } 

     mToolbar.setNavigationIcon(mToolbarNavigationIcon); 
     mToolbar.setNavigationContentDescription(i); 
    } 

    @Override 
    public void setActionBarDescription(int i) { 
     mToolbar.setNavigationContentDescription(i); 
    } 

    @Override 
    public Drawable getThemeUpIndicator() { 
     final TypedArray a = mToolbar.getContext() 
      .obtainStyledAttributes(new int[]{android.R.attr.homeAsUpIndicator}); 
     final Drawable result = a.getDrawable(0); 
     a.recycle(); 
     return result; 
    } 

    @Override 
    public Context getActionBarThemedContext() { 
     return mToolbar.getContext(); 
    } 

    .... 
} 

ActionBarDrawerToggle가 여기에 제공된 setActionBarUpIndicator(Drawable, int)을 사용합니다. Drawable이 전달되는 것을 무시하므로 표시 할 내용을 완전히 제어 할 수 있습니다.

캐치 :

@Nullable 
@Override 
public ActionBarDrawerToggle.Delegate getV7DrawerToggleDelegate() { 
    return this; 
} 
: 당신이 당신의 활동에 getV7DrawerToggleDelegate()를 오버라이드 (override) 할 필요가 있습니다,

public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, 
     Toolbar toolbar, @StringRes int openDrawerContentDescRes, 
     @StringRes int closeDrawerContentDescRes) { .... } 

을 그리고 : ActionBarDrawerToggle 우리가 여기 널 (null)로 Toolbar 매개 변수를 전달하는 경우 대리자 우리의 Activity 행동을 드릴 것입니다

알다시피 적절한 방법은 많은 추가 작업입니다. 그리고 우리는 아직 끝나지 않았습니다.

애니메이션 DrawerArrowDrawableTogglethese attributes을 사용하여 스타일을 지정할 수 있습니다. 당신이 당신의 당김 상태 (homeAsUp & 햄버거) 디폴트 같은 정확히을 원하는 경우에, 당신은 같은 그것을 구현해야합니다

/** 
* A drawable that can draw a "Drawer hamburger" menu or an Arrow 
*/ 
public class CustomDrawerArrowDrawable extends Drawable { 

    public static final float DRAWER_INDICATOR = 0f; 

    public static final float HOME_AS_UP_INDICATOR = 1f; 

    private final Activity mActivity; 

    private final Paint mPaint = new Paint(); 

    // The angle in degress that the arrow head is inclined at. 
    private static final float ARROW_HEAD_ANGLE = (float) Math.toRadians(45); 
    private final float mBarThickness; 
    // The length of top and bottom bars when they merge into an arrow 
    private final float mTopBottomArrowSize; 
    // The length of middle bar 
    private final float mBarSize; 
    // The length of the middle bar when arrow is shaped 
    private final float mMiddleArrowSize; 
    // The space between bars when they are parallel 
    private final float mBarGap; 

    // Use Path instead of canvas operations so that if color has transparency, overlapping sections 
    // wont look different 
    private final Path mPath = new Path(); 
    // The reported intrinsic size of the drawable. 
    private final int mSize; 

    private float mIndicator; 

    /** 
    * @param context used to get the configuration for the drawable from 
    */ 
    public CustomDrawerArrowDrawable(Activity activity, Context context) { 
     final TypedArray typedArray = context.getTheme() 
      .obtainStyledAttributes(null, R.styleable.DrawerArrowToggle, 
        R.attr.drawerArrowStyle, 
        R.style.Base_Widget_AppCompat_DrawerArrowToggle); 
     mPaint.setAntiAlias(true); 
     mPaint.setColor(typedArray.getColor(R.styleable.DrawerArrowToggle_color, 0)); 
     mSize = typedArray.getDimensionPixelSize(R.styleable.DrawerArrowToggle_drawableSize, 0); 
     mBarSize = typedArray.getDimension(R.styleable.DrawerArrowToggle_barSize, 0); 
     mTopBottomArrowSize = typedArray 
      .getDimension(R.styleable.DrawerArrowToggle_topBottomBarArrowSize, 0); 
     mBarThickness = typedArray.getDimension(R.styleable.DrawerArrowToggle_thickness, 0); 
     mBarGap = typedArray.getDimension(R.styleable.DrawerArrowToggle_gapBetweenBars, 0); 

     mMiddleArrowSize = typedArray 
      .getDimension(R.styleable.DrawerArrowToggle_middleBarArrowSize, 0); 
     typedArray.recycle(); 

     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setStrokeJoin(Paint.Join.ROUND); 
     mPaint.setStrokeCap(Paint.Cap.SQUARE); 
     mPaint.setStrokeWidth(mBarThickness); 

     mActivity = activity; 
    } 

    public boolean isLayoutRtl() { 
     return ViewCompat.getLayoutDirection(mActivity.getWindow().getDecorView()) 
      == ViewCompat.LAYOUT_DIRECTION_RTL; 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     Rect bounds = getBounds(); 
     final boolean isRtl = isLayoutRtl(); 
     // Interpolated widths of arrow bars 
     final float arrowSize = lerp(mBarSize, mTopBottomArrowSize, mIndicator); 
     final float middleBarSize = lerp(mBarSize, mMiddleArrowSize, mIndicator); 
     // Interpolated size of middle bar 
     final float middleBarCut = lerp(0, mBarThickness/2, mIndicator); 
     // The rotation of the top and bottom bars (that make the arrow head) 
     final float rotation = lerp(0, ARROW_HEAD_ANGLE, mIndicator); 

     final float topBottomBarOffset = lerp(mBarGap + mBarThickness, 0, mIndicator); 
     mPath.rewind(); 

     final float arrowEdge = -middleBarSize/2; 
     // draw middle bar 
     mPath.moveTo(arrowEdge + middleBarCut, 0); 
     mPath.rLineTo(middleBarSize - middleBarCut, 0); 

     final float arrowWidth = Math.round(arrowSize * Math.cos(rotation)); 
     final float arrowHeight = Math.round(arrowSize * Math.sin(rotation)); 

     // top bar 
     mPath.moveTo(arrowEdge, topBottomBarOffset); 
     mPath.rLineTo(arrowWidth, arrowHeight); 

     // bottom bar 
     mPath.moveTo(arrowEdge, -topBottomBarOffset); 
     mPath.rLineTo(arrowWidth, -arrowHeight); 
     mPath.moveTo(0, 0); 
     mPath.close(); 

     canvas.save(); 

     if (isRtl) { 
      canvas.rotate(180, bounds.centerX(), bounds.centerY()); 
     } 
     canvas.translate(bounds.centerX(), bounds.centerY()); 
     canvas.drawPath(mPath, mPaint); 

     canvas.restore(); 
    } 

    @Override 
    public void setAlpha(int i) { 
     mPaint.setAlpha(i); 
    } 

    // override 
    public boolean isAutoMirrored() { 
     // Draws rotated 180 degrees in RTL mode. 
     return true; 
    } 

    @Override 
    public void setColorFilter(ColorFilter colorFilter) { 
     mPaint.setColorFilter(colorFilter); 
    } 

    @Override 
    public int getIntrinsicHeight() { 
     return mSize; 
    } 

    @Override 
    public int getIntrinsicWidth() { 
     return mSize; 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.TRANSLUCENT; 
    } 

    public void setIndicator(float indicator) { 
     mIndicator = indicator; 
     invalidateSelf(); 
    } 

    /** 
    * Linear interpolate between a and b with parameter t. 
    */ 
    private static float lerp(float a, float b, float indicator) { 
     if (indicator == HOME_AS_UP_INDICATOR) { 
      return b; 
     } else { 
      return a; 
     } 
    } 
} 

CustomDrawerArrowDrawable's 구현 AOSP에서 빌려 만의 드로잉을 할 수 있도록 옷을 벗었되었습니다 두 상태 : homeAsUp & 햄버거. setIndicator(float)을 호출하여 이러한 상태를 전환 할 수 있습니다. 우리가 구현 한 Delegate에서 이것을 사용합니다. 또한 CustomDrawerArrowDrawable을 사용하면 xml : barSize, color 등으로 스타일을 지정할 수 있습니다.이 설정이 필요하지 않더라도 위의 구현을 사용하면 드로어 열기 및 닫기에 맞춤 애니메이션을 제공 할 수 있습니다.

내가 이것을 추천해야 할지를 솔직하게 알 수 있습니다.

<item name="android:homeAsUpIndicator">@drawable/some_back_drawable</item> 

는 현재이 ToolbarCompatDelegate#getThemeUpIndicator()에 있기 때문에 가능한 버그 발생하지 않습니다 :

@Override 
public Drawable getThemeUpIndicator() { 
    final TypedArray a = mToolbar.getContext() 
       // Should be new int[]{android.R.attr.homeAsUpIndicator} 
       .obtainStyledAttributes(new int[]{android.R.id.home}); 
    final Drawable result = a.getDrawable(0); 
    a.recycle(); 
    return result; 
} 
당신이 인수 nullActionBarDrawerToggle#setHomeAsUpIndicator(...)를 호출 할 경우


, 그것은 당신의 테마에 정의 된 드로어 블을 선택해야

이 문제에 대해 대충 설명하는 버그 보고서 (사례 4 읽기) : Link


당신이 이미 가지고있는 솔루션을 고수하기로 결정하면, PNG 파일 대신에 (R.drawable.lib_ic_arrow_back_light & R.drawable.lib_ic_menu_light)를 CustomDrawerArrowDrawable 사용을 고려하시기 바랍니다. 밀도/크기 버킷에는 여러 드로어 블이 필요하지 않으며 XML로 스타일링이 수행됩니다. 또한 최종 제품은 프레임 워크와 동일합니다.

mDrawerToggle.setDrawerIndicatorEnabled(false); 

CustomDrawerArrowDrawable toolbarNavigationIcon 
       = new CustomDrawerArrowDrawable(this, mToolbar.getContext());  

if (showHomeAsUp) { 
    toolbarNavigationIcon.setIndicator(
          CustomDrawerArrowDrawable.HOME_AS_UP_INDICATOR); 
    mDrawerToggle.setToolbarNavigationClickListener(view -> finish()); 
} else { 
    mToolbarNavigationIcon.setIndicator(
          CustomDrawerArrowDrawable.DRAWER_INDICATOR); 
    mDrawerToggle.setToolbarNavigationClickListener(view -> toggleDrawer()); 
} 

mDrawerToggle.setHomeAsUpIndicator(toolbarNavigationIcon); 
+0

나는 이것에 약간의 시간을 할애하고 이것이 유일한 추악한 해결책이라는 것을 발견했다. "테마로 설정"할 수 있다는 것은 무엇을 의미합니까? 사용자 지정 attrs 또는 일부 기본 제공 스타일을 사용하고 싶습니까? 두 개의 서로 다른 드로어 블을 전환 할 수 있어야한다는 것을 기억하십시오. 우리는 대답을 받아 들일 때까지 약간의 시간을 기다려야합니다. 어쩌면 누군가가 더 나은 접근법을 발견했을 것입니다. – tomrozb

+0

@tomrozb 테마에 설정할 속성은'android : homeAsUpIndicator'입니다. 이 후, 당신은'mDrawerToggle.setHomeAsUpIndicator (null)'을 호출 할 수 있고 xml에 주어진 drawable이 사용될 것이다. 이것은 현재 가능한 버그로 인해 발생하지 않습니다. 내 대답을 좀 더 많은 정보로 업데이트하고 버그 보고서에 대한 링크를 추가했습니다. – Vikram

4

이 내가 모든 조각의 onActivityCreated 콜백에서 호출 NavigationDrawerFragment에있는 ActionBarDrawableToggle을 제어하기위한 제 기능입니다. 게시물 기능이 필요합니다. 햄버거 아이콘이 뒤로 화살표로 바뀌고 뒤로 화살표를 클릭 할 수 있습니다. 오리엔테이션 변화는 핸들러에 의해 적절하게 처리됩니다.

... 

import android.support.v7.app.ActionBar; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBarDrawerToggle; 

... 

public class NavigationDrawerFragment extends Fragment 
{ 
    private ActionBarDrawerToggle mDrawerToggle; 

    ... 

    public void syncDrawerState() 
    { 
     new Handler().post(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       final ActionBar actionBar = activity.getSupportActionBar(); 
       if (activity.getSupportFragmentManager().getBackStackEntryCount() > 1 && (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) != ActionBar.DISPLAY_HOME_AS_UP) 
       { 
        new Handler().post(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          mDrawerToggle.setDrawerIndicatorEnabled(false); 
          actionBar.setDisplayHomeAsUpEnabled(true); 
          mDrawerToggle.setToolbarNavigationClickListener(onToolbarNavigationClickListener()); 
         } 
        }); 
       } else if (activity.getSupportFragmentManager().getBackStackEntryCount() <= 1 && (actionBar.getDisplayOptions() & ActionBar.DISPLAY_HOME_AS_UP) == ActionBar.DISPLAY_HOME_AS_UP) 
       { 
        actionBar.setHomeButtonEnabled(false); 
        actionBar.setDisplayHomeAsUpEnabled(false); 
        mDrawerToggle.setDrawerIndicatorEnabled(true); 
        mDrawerToggle.syncState(); 
       } 
      } 
     });  
    } 
} 

내 기본 조각의 내 onActivityCreated 메소드입니다.drawerToggle를 만들 때

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) 
{ 
    super.onActivityCreated(savedInstanceState); 
    navigationDrawerFragment.syncDrawerState(); 
} 
+0

거룩한 ... 나는 2 시간 후에 그 답을 발견했다. 어떻게 정확히 사용하고 있는지 모르겠지만 OnBackStackChangedListener의 주요 활동 안에 구현하면 모든 것이 작동하기 시작합니다. 주요 활동에서 단편 스택을 처리하는 모든 사람에게 : http://pastebin.com/YqKBTiXa – Marurban

47

이 애니메이션을 사용할 수 없게됩니다, onDrawerSlide()를 오버라이드 (override) : 완전히 화살표를 제거하려면

drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, 
     getToolbar(), R.string.open, R.string.close) { 

    @Override 
    public void onDrawerClosed(View view) { 
     super.onDrawerClosed(view); 
    } 

    @Override 
    public void onDrawerOpened(View drawerView) { 
     super.onDrawerOpened(drawerView); 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
     super.onDrawerSlide(drawerView, 0); // this disables the animation 
    } 
}; 

, 당신은에

super.onDrawerSlide(drawerView, 0); // this disables the arrow @ completed state 

을 추가 할 수 있습니다 onDrawerOpened 함수의 끝.

+1

이 기능을 사용하면 애니메이션을 비활성화 할 수 있습니다. 그러나'setDisplayHomeAsUpEnabled'는 더 이상 작동하지 않습니다. Ik는 햄버거를 계속 보여줍니다. 운 좋게도 나는 뒤로 화살표가 필요 없다. – ar34z

+2

슬프게도, 이것은 사실 일 수 있습니다. 나는 햄버거를 전혀 사용하지 않는 곳에서만 홈 업을 사용합니다. – Frank

+2

또한 onDrawerOpened 함수 끝에'super.onDrawerSlide (drawerView, 0); '를 추가하는 대신'super.onDrawerOpened (drawerView);를 주석 처리하여 화살표를 완전히 제거 할 수 있습니다. –

1

애니메이션을 사용하지 않으려면 ActionBarDrawerToggle을 사용하지 마십시오. 아래 코드를 대신 사용하십시오. toggle.setDrawerSlideAnimationEnabled(false)

여기 내가 사용하는 코드 조각은 다음과 같습니다 :

toolbar.setNavigationIcon(R.drawable.ic_menu); 
toolbar.setNavigationOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        drawer.openDrawer(GravityCompat.START); 
       } 
      }); 
+0

질문을 읽어보십시오. "내 질문은이 애니메이션을 적절하게 비활성화하고 getSupportActionBar()를 사용하여 햄버거 또는 뒤로 화살표를 표시하는 방법입니다 .setDisplayHomeAsUpEnabled (true);" – tomrozb

+0

Toolbar.setNavigationIcon()과 [google/material-design-icons] 아이콘 (https://github.com/google/material-design-icons/tree/master/)을 사용하여 햄버거 또는 뒤로 화살표 아이콘을 설정할 수 있습니다. 탐색/drawable-anydpi-v21) – Evan

3

지금 애니메이션 해제하는 전용 방법이 내가 이런 식으로 시도했습니다

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    [...] 

    ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
      this, drawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); 
    toggle.setDrawerSlideAnimationEnabled(false); 
    drawer.addDrawerListener(toggle); 
    toggle.syncState(); 
} 
관련 문제