내 활동에 마커가있는지도가 있습니다. 사용자가 마커를 클릭하면 하단 시트에 해당 장소에 대한 세부 정보가 표시됩니다.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 나에게 이것을 설명하지만, 문제는 몇 일 동안 나를 미치게 만든 것은 힘들었다
. 당신이 제공 할 수있는 모든 도움에 정말 감사드립니다!
을 지원하는 경우
또한, 24.0.0 LIB 최신 지원에서 이것에 대한 버그 수정이 될 것 같다? 나는 똑같은 문제가있는 것으로 보인다. 그것은 removeAllViews를 사용할 때 발생합니다. removeAllViews를 사용하지 않으면 작동합니다. – peshkira
@peshkira nope. 내가 포기한 – alashow
오, noes :/... 그것은 바닥 시트와 레이아웃 수명주기 문제, 디버거가 말하기 때문에, 나를 위해 삽입됩니다 전망. 그러나 나는 그들을 보지 못한다. – peshkira