在我的活动中,我有带有标记的地图。当用户单击标记时,它显示了带有底部表的详细信息。
第一次看到有关位置的数据时,它可以正常工作。但是,在隐藏底部表之后,然后再次单击后显示它无法正常工作:TextView保存旧高度(view.invalidate()
不起作用)。 viewGroup.addView
方法不起作用(在添加之前调用viewGroup.removeAllViews()
,但它保持旧的高度和添加视图不起作用)。
但是,当我更改视图数据而不隐藏/显示底部表格时,所有事物都可以正常工作。喜欢第一次更改。
我在调试时也看到了其他其他怪异的行为:我有4个相关性的线条(内部有textView和imageView)。当我更改一个/两个的可见性(消失/可见)时,即使Linearlayout具有垂直方向,它们也会相互重叠。但并非总是像上面一样:第一次工作还可以,如果我更改底部表格不正常时,其他时间(如所述),但是当可见底部行为时,如果我更改底部的视图,并且可以更改视图,则可以正常工作(例如第一时间)。
如果我没记错的话,那是由于底部的表格。因为,我以前没有看到这种观点的这种行为。
我的代码:
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>
ScreenRecord:https://drive.google.com/file/d/0b5up2cgqawsdbuztq2h1vdbwbms/view?usp = drivesdk
对我来说很难解释这一点,但是这个问题使我生气了几天。非常感谢您提供的任何帮助!
我解决了以下解决方法的类似问题。
在我的BottomSheetCallback
中,我添加了以下内容:
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) {
}
});
它仍然不完美,因为新布局需要一些时间才能渲染,并且视图带有一些滞后。但是总比没有好。
另外,如果您已经支持目标24
https://code.google.com/p/android/issues/detail?id=205226