6

내 탐색 창에 https://github.com/neokree/MaterialNavigationDrawer, 내 FAB 구현에 https://gist.github.com/Jogan/9def6110edf3247825c9을 사용하고 있습니다. 탐색 서랍을 열면 FAB를 덮지 않고 버튼이 그 위에 나타납니다. 나는 버튼을 숨기고 서랍 열기/닫기를 오히려 혼란스럽게하는 것을 피하고 싶습니다. 이 문제를 해결하는 방법에 대한 아이디어가 있습니까?내비게이션 창에 부동 동작 버튼이 나타납니다

편집 : 내가 프로그래밍 다음을 수행 팹을 추가하고 :

fabButton = new FloatingActionButton.Builder(this) 
      .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
      .withButtonColor(0xFF2196F3) 
      .withGravity(Gravity.BOTTOM | Gravity.END) 
      .withMargins(0, 0, 16, 16) 
      .create(); 

를 해결하지 않는 조각에 그 선언을 변경. 위에 링크 된 Nav Bar 구현은 MaterialNavigationDrawer 클래스에서 확장해야하는 활동이 필요합니다.이 클래스는 Nav Drawer를 먼저 그릴 수 있으며 버튼을 항상 마지막으로 유지합니다. 프로그래밍 방식으로 요소의 순서를 지정하는 방법이 있습니까?

답변

7

이 FAB 구현이 FAB를 콘텐츠보기 (android.R.id.content)에 추가하기 때문에 탐색 창을 열면 FAB이 표시됩니다. 탐색 서랍 구현에 따라보기 계층에서 동일한 레벨에있는 것처럼 보입니다.

다른 FAB 구현으로 전환하고 싶지 않은 경우. onDrawerSlide(View drawerView, float offset)을 사용하고 서랍을 열 때 FAB alpha를 변경하십시오. 또한 onDrawerClose() 또는 onDrawerOpen() 내부에서도 가시성을 전환 할 수 있습니다.

편집 : 나는 거기에 알파를 포함하거나 버튼을 전환하지 않는 깔끔한 해결책을 발견했습니다

@Override 
public void onDrawerSlide(View drawerView, float offset){ 
    fabButton.setAlpha(offset); 
} 
+0

나는 가시성을 변경해 보았지만 작동하지만 애니메이션은 서랍에서 단추쪽으로주의를 환기시킵니다. 알파에 대해 자세히 설명해 주시겠습니까? 나는 그것에 익숙하지 않습니다. –

+1

글쎄, 두 가지 옵션이 있습니다. 기존 구현을 수정하여 조각 레이아웃에 FAB를 추가하거나 탐색 서랍이 들여다 보면 바로 fab을 숨 깁니다. 알파 변경에 대한 질문이 있으면 편집을 참조하십시오. –

+0

구현은 애니메이션에 도움이됩니다. 나는 nav drawer가 버튼 위에 겹치게하는 것이 이상적이다. 내가 가지고있는 문제는 Nav Drawer 구현에서 onCreate 메서드가 없어서 콘텐츠 뷰를 설정할 수 없다는 것입니다. 대신 서랍의 첫 번째 섹션에 고정 된 조각을 실행하므로 해당 지점에서 조각의 레이아웃을 사용할 수 없습니다. 콘텐츠보기에서 광고 주문을 변경할 수있는 방법이 있습니까? –

2

때 서랍의 (만드는이 지연처럼) 열거 나 닫을. 프로그래밍 방식으로 서랍의 오프셋이 변경되는 동안 버튼의 끝 마진을 수정하여 활동 창의 밖으로 전환 할 수 있습니다.

final FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams(); 

:

onDrawerSlide 방법 밖에, 다음과 같은 코드를 사용하여 FAB의 레이아웃 매개 변수를 받아야합니다, 모든 그래서 첫 번째 (레이아웃에서 버튼의의를 따라, 내 경우에는, 그것은 FrameLayout입니다) y = mx + n, y는 여백, m은 기울기 (사용자가 수정할 수 있음), x는 slideOffset, 'x'는 간단한 수학 선형 방정식을 기반으로합니다. n은 기본/원래 여백 (16dp)입니다. 그런 다음

int density = (int) Resources.getSystem().getDisplayMetrics().density; 
final int defaultMargin = 16 * density; 
final int slope = -100 * density; 

, onDrawerSlide 내에서, 다음을 수행하십시오 :

params.setMarginEnd((int) (slope * slideOffset + defaultMargin)); 
fab.setLayoutParams(params); 

이 '아무튼 경우를 이렇게하면 디스플레이 밀도의 풍요 로움을 존중하면서 픽셀로 변수에 대한 기본 마진과 기울기를 할당하는 방법이다 제대로 작동하지 않는 경우 버튼을 구성 할 때 marginEnd 버튼을 설정하거나 다음과 같이 레이아웃 매개 변수의 여백을 설정하십시오 (marginEnd이 올바른지 또는 왼쪽인지 확인해야하지만) :

params.setMargins(int left, int top, int right, int bottom); 

도움이 되었기를 바랍니다. 이것은 나의 첫 번째 대답이므로 많은 불만이 없기를 바랍니다.

1

이것은 나를 대신 할 대안입니다. yourlayout.xml에 FAB를 추가한다고 가정합니다. 지금 지금과 같이 FAB 선언 변경

public FloatingActionButton create(FrameLayout framelayout) { 
    ... 
    framelayout.addView(button, params); 
    return button; 
} 

교체를 FloatingActionButton.java 지금

<FrameLayout 
     android:id="@+id/myframelayout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

yourlayout.xml

에있어서

public FloatingActionButton create() { 
    ... 
    ViewGroup root = (ViewGroup) activity.findViewById(android.R.id.content); 
    root.addView(button, params); 
    return button; 
} 

을 FrameLayout이를 생성한다.

FrameLayout yourframelayout = (FrameLayout)findViewById(R.id.myframelayout); 

fabButton = new FloatingActionButton.Builder(this) 
     .withDrawable(getResources().getDrawable(R.drawable.ic_action_edit)) 
     .withButtonColor(0xFF2196F3) 
     .withGravity(Gravity.BOTTOM | Gravity.END) 
     .withMargins(0, 0, 16, 16) 
     .create(yourframelayout); 

그게 전부 야 !!

0

내가 니콜라 Despotoski 솔루션을 업데이트하고 있습니다 : 언제든지 사용자가 공장이 일어날 후 아무것도 표시되지 않습니다 장소에서 도청 그래서 만약

그래서 당신이 알파를 설정 한 후 또한 팹/비활성화 숨길 수 있습니다.

mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.drawer_open, 
       R.string.drawer_close) { 
    public void onDrawerClosed(View view) { 
       // Visible/Enable the FAB 
    } 

    public void onDrawerOpened(View drawerView) { 
       // Hide/Disable the FAB 
    } 

    @Override 
    public void onDrawerSlide(View drawerView, float slideOffset) { 
       // invert the slideOffset value 
       fab.setAlpha(1-slideOffset); 
    } 
};