2016-06-18 5 views
2

내 활동에 마커가있는지도가 있습니다. 사용자가 마커를 클릭하면 하단 시트에 해당 장소에 대한 세부 정보가 표시됩니다.android - bottom 동작 하위 뷰 변경이 항상 작동하지 않는 경우

보기가 처음 장소에 대한 데이터로 가득 차면 제대로 작동합니다. 그러나 바닥 시트를 숨긴 후에 다시 클릭 한 후 다시 표시하면 올바르게 작동하지 않습니다. TextView에 이전 높이 저장 (view.invalidate()이 작동하지 않음). viewGroup.addView 메서드가 작동하지 않습니다 (추가하기 전에 viewGroup.removeAllViews()을 호출하지만 이전 높이를 유지하고보기를 추가해도 작동하지 않음).

하지만 bottomSheet를 숨기거나 표시하지 않고보기 데이터를 변경하면 모든 것이 제대로 작동합니다. 처음으로 변화하는 것.

디버깅하는 동안 다른 이상한 행동을 보았습니다 : 나는 4 개의 relativeLayouts (textView 및 imageView 내부)가있는 linearLayout을 가졌습니다. linearLayout에 수직 방향이 있어도 1/2의 가시성 (사라짐/가시성)을 변경하면 서로 중첩됩니다. 하지만 항상 그렇지는 않습니다. 첫 번째 시간은 정상적으로 작동합니다. bottomSheet가 보이지 않을 때 뷰를 변경하면 다른 방법으로 제대로 작동하지 않지만 bottomBehavior가 표시되고보기를 변경하면 처음처럼 작동합니다. 시각).

내가 실수가 아니라면, 그것은 바닥 시트 때문입니다. 내가 전에 안드로이드에서 이런 동작을 보지 못했기 때문입니다.

내 코드 :

mBottomSheetBehavior = BottomSheetBehavior.from(bottomSheetView); 
    mBottomSheetBehavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
     @Override 
     public void onStateChanged(@NonNull View bottomSheet, int newState) { 
      switch (newState) { 
       case BottomSheetBehavior.STATE_HIDDEN: 
        hidePlaceDetails(); 
        break; 
      } 
     } 

     @Override 
     public void onSlide(@NonNull View bottomSheet, float slideOffset) { 
     } 
    }); 

/** 
* Show bottom sheet with given place details and start load route 
* 
* @param place the place 
*/ 
private void showPlaceDetails(Place place) { 
    placeTitleView.setText(place.getTitle()); 
    placeCategoryView.setText(place.getParentTitle()); 

    placeInfoGroup.removeAllViews(); 
    addPlaceInfo(R.drawable.ic_info, place.getDescription(), null); 
    addPlaceInfo(R.drawable.ic_place, place.getAddress(), null); 
    addPlaceInfo(R.drawable.ic_phone, place.getPhoneNumbers(), null); 
    addPlaceInfo(R.drawable.ic_language, place.getWebsite(), null); 

    Photo photo = place.getPhoto(); 
    if (U.isEmpty(photo.getImagePath())) { 
     U.hideView(placePhotoView); 
    } else { 
     U.showView(placePhotoView); 
     int proportionalHeight = U.calculateProportionalHeight(
      screenSize[0] /*screenWidth*/, 
      photo.getWidth(), 
      photo.getHeight(), 
      800 /*maxHeight*/); 
     FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
      ViewGroup.LayoutParams.MATCH_PARENT, 
      proportionalHeight 
     ); 

     placePhotoView.setLayoutParams(layoutParams); 
     ImageUtils.networkImage(this, photo, placePhotoView, null, U.imagePlaceholder()); 
    } 

    U.view(placeDistanceProgressView, true); //showView 
    U.view(placeDistanceView, false); //hideView 
    if (mMap.getMyLocation() != null) { 
     Waypoint myLocation = new Waypoint(mMap.getMyLocation().getLongitude(), mMap.getMyLocation().getLatitude()); 
     Waypoint destination = new Waypoint(place.getPosition().getLongitude(), place.getPosition().getLatitude()); 

     getAndDrawRoute(place, myLocation, destination); 
    } 

    int thirdScreen = screenSize[1]/3; 
    mMap.setPadding(0, 0, 0, halfScreen); 
    isShowingPlaceDetails = true; 
    mBottomSheetBehavior.setPeekHeight(halfScreen); 
    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); 
} 

/** 
* Hide bottom sheet and add markers 
*/ 
private void hidePlaceDetails() { 
    mMap.setPadding(0, 0, 0, 0); 
    mBottomSheetBehavior.setPeekHeight(0); 
    mBottomSheetBehavior.setHideable(true); 
    mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); 
    addMarkers(); 
    isShowingPlaceDetails = false; 
} 

/** 
* @param icon   icon res 
* @param title   title 
* @param onClickListener nullable 
*/ 
private void addPlaceInfo(
    @DrawableRes int icon, String title, @Nullable View.OnClickListener onClickListener) { 
    View root = LayoutInflater.from(this).inflate(R.layout.layout_map_bottom_sheet_row, null); 
    ImageView iconView = ButterKnife.findById(root, R.id.place_icon); 
    TextView titleView = ButterKnife.findById(root, R.id.place_title); 
    iconView.setImageResource(icon); 
    titleView.setText(U.notEmpty(title) ? title : Html.fromHtml(String.format("<i>%s</i>", "None"))); 

    if (onClickListener != null) { 
     root.setOnClickListener(onClickListener); 
    } 
    placeInfoGroup.addView(root); 
} 

활동 * .XML

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:id="@+id/drawer" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 

<android.support.design.widget.CoordinatorLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <include layout="@layout/toolbar_appbar"/> 

    <RelativeLayout 
     android:id="@+id/content" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

     ... 
    </RelativeLayout> 

    <android.support.v4.widget.NestedScrollView 
     android:id="@+id/bottomSheet" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     android:background="@android:color/white" 
     android:elevation="4dp" 
     app:behavior_peekHeight="0dp" 
     app:layout_behavior="android.support.design.widget.BottomSheetBehavior"> 

     <include layout="@layout/layout_map_bottom_sheet"/> 

    </android.support.v4.widget.NestedScrollView> 

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

... 

layout_map_bottom_sheet.xml

<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@android:color/white" 
android:orientation="vertical" 
android:paddingTop="@dimen/content.margin"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingLeft="@dimen/content.padding.big" 
    android:paddingStart="@dimen/content.padding.big" 
    android:paddingRight="@dimen/content.padding" 
    android:paddingEnd="@dimen/content.padding"> 

    <TextView 
     android:id="@+id/place.title" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:lineSpacingExtra="@dimen/text.line.space" 
     android:textColor="@color/text.color" 
     android:textSize="@dimen/text.xlarge" 
     tools:text="@string/lorem.place.title"/> 

    <TextView 
     android:id="@+id/place.category" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:lineSpacingExtra="@dimen/text.line.space" 
     android:paddingBottom="@dimen/content.padding.small" 
     android:paddingTop="@dimen/content.padding.small" 
     android:textSize="@dimen/text.medium" 
     android:textColor="@color/text.secondary.color" 
     tools:text="@string/lorem.short"/> 

    <include layout="@layout/divider"/> 

    <TextView 
     android:id="@+id/place.distance" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:paddingBottom="@dimen/content.padding.small" 
     android:paddingTop="@dimen/content.padding.small" 
     android:textColor="?attr/colorPrimary" 
     android:visibility="gone" 
     tools:text="@string/lorem.place.distance"/> 

    <ProgressBar 
     android:id="@+id/place.distance.progress" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:layout_marginTop="@dimen/content.padding.small" 
     android:layout_marginBottom="@dimen/content.padding.small"/> 

    <include layout="@layout/divider"/> 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/place.infos" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
</LinearLayout> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:id="@+id/place.photo" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:scaleType="centerCrop" 
     tools:src="@drawable/sample"/> 
</FrameLayout> 

,363,210

Screenrecord : https://drive.google.com/file/d/0B5up2CgQawSDbUZtQ2h1VDBWbms/view?usp=drivesdk 나에게 이것을 설명하지만, 문제는 몇 일 동안 나를 미치게 만든 것은 힘들었다

. 당신이 제공 할 수있는 모든 도움에 정말 감사드립니다!

+0

을 지원하는 경우

또한, 24.0.0 LIB 최신 지원에서 이것에 대한 버그 수정이 될 것 같다? 나는 똑같은 문제가있는 것으로 보인다. 그것은 removeAllViews를 사용할 때 발생합니다. removeAllViews를 사용하지 않으면 작동합니다. – peshkira

+0

@peshkira nope. 내가 포기한 – alashow

+0

오, noes :/... 그것은 바닥 시트와 레이아웃 수명주기 문제, 디버거가 말하기 때문에, 나를 위해 삽입됩니다 전망. 그러나 나는 그들을 보지 못한다. – peshkira

답변

1

다음 해결 방법으로 비슷한 문제가 해결되었습니다. 새로운 레이아웃 렌더링하는 데 약간의 시간이 소요되며 전망이 일부 지연에 팝업 때문에

behavior.setBottomSheetCallback(new BottomSheetBehavior.BottomSheetCallback() { 
    @Override 
    public void onStateChanged(final View bottomSheet, int newState) { 
    switch (newState) { 
     case BottomSheetBehavior.STATE_COLLAPSED: 
     case BottomSheetBehavior.STATE_EXPANDED: 
     bottomSheet.post(new Runnable() { 
      @Override 
      public void run() { 
      bottomSheet.requestLayout(); // this seems to fix it. 
      } 
     }); 
     break; 
     case BottomSheetBehavior.STATE_HIDDEN: 
     // remove the views here with removeAllViews(); 
     break; 
    } 
    } 

    @Override 
    public void onSlide(View bottomSheet, float slideOffset) { 

    } 
}); 

그것은 아직 완벽하지 않습니다 : 내 BottomSheetCallback에서

나는 다음과 같은 추가. 그러나 아무것도 아닌 것보다 낫다. 이미 대상에게이 문제를 해결 않았다 (24)

https://code.google.com/p/android/issues/detail?id=205226

+0

레이아웃을 무효화하려고 시도했습니다. 그러나 그것은 효과가 없었습니다. 하지만 게시 실행 상태에서 확장 상태에서 무효화하려고 시도하지 않았습니다. 레이아웃 구조를 변경하여 솔루션의 작동 여부를 테스트 할 수 없습니다. 나는 다른 사용자가 당신의 솔루션에 투표한다면 해결책으로 받아 들일 것입니다. 감사! – alashow

+0

위대한. 'invalidate'는'requestLayout'과 같지 않습니다. 무효화는 레이아웃을 더티라고 표시하는 반면, requestLayout은 새로운 레이아웃 패스를 스케쥴링합니다. – peshkira