2016-08-22 2 views
7

"하단 시트"유형의 레이아웃을 구현하고 싶지만 "하단"시트가 위/아래 드래그 가능보기로는 잘 작동하지 않는 MapFragment가되는 비틀기가 있습니다.Android '상단 시트'는 '하단 시트'와 동일합니까?

로직을 "Top Sheet"디자인으로 "뒤집어"Top Sheet를 위로/아래로 드래그하여 아래쪽 MapFragment를 더 많거나 적게 표시하는 것은 당연한 생각이었습니다.

예 :
Bottom Sheet Example

...이에서 ...이 [같은]에 ...
Top Sheet Example

는 지원 디자인 도구 제공이 가능, 또는 내가 가진 것 혼자서 이렇게 굴리는거야?

+2

두 가지 작업을 수행하기 위해 엄청난 양의 작업을 수행 할 것입니다. 첫째, 사용자 정의 구현을 작성하십시오. 둘째, 구현이 Android 구현과 충돌하는 방식을 식별하고 이러한 시나리오를 방어하는 것입니다. 내 개인적인 견해로, Material Design Language는 사용자가 앱과 상호 작용할 수있는 방법을 시각적으로 전달하기 위해 배치되었습니다. 이 같은 것이 학습을위한 개인적인 노력으로는 좋지만 일단 시장에 나오면 모든 사람이 앱 사용법을 이해하지 못할 것이라고 예상해야합니다. – apelsoczi

+0

사용자가 도구 모음을 끌어 올 수있는 툴바가있는 하단 시트 레이아웃을 추가하기 만했습니다. 트릭은 사용자가 툴바를 드래그 할 때 맵의 크기를 조정하는 것입니다. 누군가가 관심이 있다면 내 코드를 게시 할 수 있습니다. – swooby

+0

@swooby를보고 싶습니다. 비슷한 해결책을 시도하고 있습니다. – odiggity

답변

1

여기 내가 위에 언급 한 내 솔루션의 기초입니다. 나는 나중에 그것을 다시 살릴거야.

@Override 
protected void onCreate(
     @Nullable 
       Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    if (isFinishing()) 
    { 
     return; 
    } 


    setContentView(R.layout.activity_home); 

    ... 

    mGroupBottomSheetFiller = (ViewGroup) findViewById(R.id.groupBottomSheetFiller); 

    final NestedScrollView bottomSheetMap = (NestedScrollView) findViewById(R.id.bottomSheetMap); 
    mBottomSheetMapBehavior = BottomSheetBehavior.from(bottomSheetMap); 
    mBottomSheetMapBehavior.setBottomSheetCallback(new BottomSheetCallback() 
    { 
     @Override 
     public void onStateChanged(
       @NonNull 
         View bottomSheet, 
       int newState) 
     { 
      //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, newState=" + 
      //    bottomSheetBehaviorStateToString(newState) + ')'); 
      int visibility = isBottomSheetExpanded(mBottomSheetMapBehavior) ? View.VISIBLE : View.GONE; 
      mImageBottomSheetMapClose.setVisibility(visibility); 
     } 

     @Override 
     public void onSlide(
       @NonNull 
         View bottomSheet, 
       float slideOffset) 
     { 
      //Log.e(TAG, "mBottomSheetMapBehavior.onStateChanged(bottomSheet, slideOffset=" + slideOffset + ')'); 
      resizeMap(); 
     } 
    }); 
    bottomSheetMap.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 
    { 
     @Override 
     public void onGlobalLayout() 
     { 
      //Log.e(TAG, "onGlobalLayout()"); 
      bottomSheetMap.getViewTreeObserver().removeOnGlobalLayoutListener(this); 
      resizeMap(); 
     } 
    }); 

    ... 
} 

private void resizeMap() 
{ 
    int screenHeightPixels = PbPlatformUtils.getScreenHeightPixels(); 
    //Log.e(TAG, "resizeMap: screenHeightPixels=" + screenHeightPixels); 

    int[] location = new int[2]; 
    mGroupMap.getLocationInWindow(location); 
    //Log.e(TAG, "resizeMap: getLocationInWindow=" + Arrays.toString(location)); 

    LayoutParams groupMapLayoutParams = mGroupMap.getLayoutParams(); 
    groupMapLayoutParams.height = screenHeightPixels - location[1]; 
    mGroupMap.requestLayout(); 
} 

public static String bottomSheetBehaviorStateToString(int state) 
{ 
    String s; 
    switch (state) 
    { 
     case BottomSheetBehavior.STATE_COLLAPSED: 
      s = "STATE_COLLAPSED"; 
      break; 
     case BottomSheetBehavior.STATE_DRAGGING: 
      s = "STATE_DRAGGING"; 
      break; 
     case BottomSheetBehavior.STATE_EXPANDED: 
      s = "STATE_EXPANDED"; 
      break; 
     case BottomSheetBehavior.STATE_HIDDEN: 
      s = "STATE_HIDDEN"; 
      break; 
     case BottomSheetBehavior.STATE_SETTLING: 
      s = "STATE_SETTLING"; 
      break; 
     default: 
      s = "UNKNOWN"; 
      break; 
    } 
    return s + '(' + state + ')'; 
} 

private static boolean isBottomSheetExpanded(
     @NonNull 
       BottomSheetBehavior bottomSheetBehavior) 
{ 
    return bottomSheetBehavior.getState() == BottomSheetBehavior.STATE_EXPANDED; 
} 

private void bottomSheetMapExpand() 
{ 
    mGroupBottomSheetFiller.setVisibility(View.VISIBLE); 
    int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height); 
    mBottomSheetMapBehavior.setPeekHeight(peekHeightPx); 
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_EXPANDED); 
    mBottomSheetMapBehavior.setHideable(false); 
} 

private void bottomSheetMapCollapse() 
{ 
    mGroupBottomSheetFiller.setVisibility(View.VISIBLE); 
    int peekHeightPx = getResources().getDimensionPixelSize(R.dimen.home_bottom_sheet_map_peek_height); 
    mBottomSheetMapBehavior.setPeekHeight(peekHeightPx); 
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 
    mBottomSheetMapBehavior.setHideable(false); 
} 

private void bottomSheetMapHide() 
{ 
    mBottomSheetMapBehavior.setHideable(true); 
    mBottomSheetMapBehavior.setPeekHeight(0); 
    mBottomSheetMapBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); 
    mGroupBottomSheetFiller.setVisibility(View.GONE); 
} 
+1

이 솔루션과의 호환성 문제가 있습니까? 당신은이 기능을 사용하여 플레이 스토어에서 작동하는 응용 프로그램을 가지고 있다면 체크 아웃하는 것이 좋을 것입니다 :) – carlosavoy

관련 문제