在我的活动中,我有一个带有标记的地图。当用户单击标记时,它会显示有关该地点的详细信息并在底部面板中展示。
视图第一次填充有关位置的数据时,它可以正常工作。但是,在隐藏底部面板后再次点击后,它就无法正常工作: TextView保存旧高度(
但是,如果在不隐藏/显示bottomSheet的情况下更改视图数据,则所有事情都可以正常工作。就像第一次更改一样。
我在调试时看到其他奇怪的行为:我有一个包含4个RelativeLayout(内部带有TextView和ImageView)的LinearLayout。当我更改其中一个/两个的可见性(gone / visible)时,它们会重叠在一起,即使LinearLayout具有垂直方向。但并不总是这样,就像上面所述:第一次可以正常工作,其他时间如果在bottomSheet不可见时更改视图不起作用(如上所述),但是当bottomBehavior可见时,如果我更改视图,则可以正常工作(就像第一次一样)。
如果我没有弄错,这是由于bottomSheet。因为我之前没有在Android上看到过这样的视图行为。
我的代码:
视图第一次填充有关位置的数据时,它可以正常工作。但是,在隐藏底部面板后再次点击后,它就无法正常工作: TextView保存旧高度(
view.invalidate()
不起作用)。
viewGroup.addView
方法不起作用(在添加之前调用viewGroup.removeAllViews()
,但它保留了旧高度,并且添加视图不起作用)。但是,如果在不隐藏/显示bottomSheet的情况下更改视图数据,则所有事情都可以正常工作。就像第一次更改一样。
我在调试时看到其他奇怪的行为:我有一个包含4个RelativeLayout(内部带有TextView和ImageView)的LinearLayout。当我更改其中一个/两个的可见性(gone / visible)时,它们会重叠在一起,即使LinearLayout具有垂直方向。但并不总是这样,就像上面所述:第一次可以正常工作,其他时间如果在bottomSheet不可见时更改视图不起作用(如上所述),但是当bottomBehavior可见时,如果我更改视图,则可以正常工作(就像第一次一样)。
如果我没有弄错,这是由于bottomSheet。因为我之前没有在Android上看到过这样的视图行为。
我的代码:
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);
}
activity*.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>
屏幕录制:https://drive.google.com/file/d/0B5up2CgQawSDbUZtQ2h1VDBWbms/view?usp=drivesdk
我很难解释这个问题,但这个问题让我疯狂了几天。如果您能提供任何帮助,我会非常感激!