底部行为 子视图更改并不总是有效



在我的活动中,我有带有标记的地图。当用户单击标记时,它显示了带有底部表的详细信息。

第一次看到有关位置的数据时,它可以正常工作。但是,在隐藏底部表之后,然后再次单击后显示它无法正常工作: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

相关内容

  • 没有找到相关文章

最新更新