Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android-底部行为子视图不改变';我不总是工作_Android_Android Layout_Android Support Design - Fatal编程技术网

android-底部行为子视图不改变';我不总是工作

android-底部行为子视图不改变';我不总是工作,android,android-layout,android-support-design,Android,Android Layout,Android Support Design,在我的活动中,我有带标记的地图。当用户单击“标记”时,它会显示有关该位置的详细信息以及底部板材 当视图第一次填充有关place的数据时,它工作正常。但在隐藏底页,然后再次单击后显示它后,它无法正常工作: TextView保存旧高度(view.invalidate()不起作用)。 viewGroup.addView方法不起作用(在添加之前调用viewGroup.removeAllViews(),但它保持原有高度,添加视图不起作用) 但是,当我在不隐藏/显示底部工作表的情况下更改视图数据时,所有事情

在我的活动中,我有带标记的地图。当用户单击“标记”时,它会显示有关该位置的详细信息以及底部板材

当视图第一次填充有关place的数据时,它工作正常。但在隐藏底页,然后再次单击后显示它后,它无法正常工作: TextView保存旧高度(
view.invalidate()
不起作用)。
viewGroup.addView
方法不起作用(在添加之前调用
viewGroup.removeAllViews()
,但它保持原有高度,添加视图不起作用)

但是,当我在不隐藏/显示底部工作表的情况下更改视图数据时,所有事情都正常工作。喜欢第一次改变

在调试过程中,我还看到了其他一些奇怪的行为:我有一个linearLayout,它有4个RelativeLayout(里面有textView和imageView)。当我更改一个/两个的可见性(消失/可见)时,它们将彼此重叠,即使线性布局具有垂直方向。但并非总是如此,正如上面所述:第一次可以正常工作,其他时候,如果我在底部工作表不可见时更改视图,则无法正常工作(如前所述),但当底部行为可见时,如果我更改视图,则可以正常工作(如第一次)

如果我没弄错的话,那是因为底片。因为,我以前在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);
}
mBottomSheetBehavior=BottomSheetBehavior.from(bottomSheetView);
mBottomSheetBehavior.setBottomSheetCallback(新的BottomSheetBehavior.BottomSheetCallback(){
@凌驾
公共void onStateChanged(@NonNull View bottomSheet,int newState){
交换机(新闻状态){
case BottomSheetBehavior.STATE_隐藏:
hidePlaceDetails();
打破
}
}
@凌驾
幻灯片上的公共空白(@NonNull视图底页,浮动幻灯片偏移){
}
});
/**
*显示具有给定位置详细信息的底部板材和开始装载路线
*
*@param放置该位置
*/
私有void showPlaceDetails(Place){
placeTitleView.setText(place.getTitle());
placeCategoryView.setText(place.getParentTitle());
placeInfoGroup.removeallview();
addPlaceInfo(R.drawable.ic_info,place.getDescription(),null);
addPlaceInfo(R.drawable.ic_place,place.getAddress(),null);
addPlaceInfo(R.drawable.ic_phone,place.getPhoneNumber(),null);
addPlaceInfo(R.drawable.ic_语言,place.getWebsite(),null);
Photo Photo=place.getPhoto();
if(U.isEmpty(photo.getImagePath())){
U.hideView(placePhotoView);
}否则{
U.showView(placePhotoView);
整数比例高度=U.计算比例高度(
屏幕大小[0]/*屏幕宽度*/,,
photo.getWidth(),
photo.getHeight(),
800/*最大高度*/);
FrameLayout.LayoutParams LayoutParams=新建FrameLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_父级,
比例重量
);
placePhotoView.setLayoutParams(layoutParams);
networkImage(this,photo,placePhotoView,null,U.imagePlaceholder());
}
U.view(placeDistanceProgressView,true);//showView
U.view(placeDistanceView,false);//隐藏视图
if(mMap.getMyLocation()!=null){
航路点myLocation=新航路点(mMap.getMyLocation().getLength(),mMap.getMyLocation().getLatitude());
航路点目的地=新航路点(place.getPosition().getLength(),place.getPosition().getLatitude());
getAndDrawRoute(地点、我的位置、目的地);
}
int thirdScreen=屏幕大小[1]/3;
mMap.setPadding(0,0,0,半屏幕);
isShowingPlaceDetails=true;
mBottomSheetBehavior.setpeek高度(半屏幕);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_崩溃);
}
/**
*隐藏底部图纸并添加标记
*/
私有void hidePlaceDetails(){
mMap.setPadding(0,0,0,0);
mBottomSheetBehavior.setpeek高度(0);
mBottomSheetBehavior.sethidable(true);
mBottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN);
添加标记();
isShowingPlaceDetails=false;
}
/**
*@param图标res
*@param title
*@param onClickListener可为空
*/
私有void addPlaceInfo(
@DrawableRes int图标,字符串标题,@Nullable View.OnClickListener(OnClickListener){
视图根=LayoutFlater.from(this).充气(R.layout.layout\u map\u bottom\u sheet\u row,空);
ImageView iconView=ButterKnife.findById(根,R.id.place\u图标);
TextView titleView=ButterKnife.findById(根,R.id.place\u title);
设置图像资源(图标);
titleView.setText(U.notEmpty(title)?title:Html.fromHtml(String.format(“%s”,“None”));
if(onClickListener!=null){
setOnClickListener(onClickListener);
}
placeInfoGroup.addView(根目录);
}
活动*.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>

...


这对我来说很难解释,但这个问题让我疯狂了好几天。我真的很感激你能提供的任何帮助

我通过以下解决方法解决了类似的问题

在我的
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) {

  }
});
它仍然不是完美的,因为新的布局需要一些时间来渲染,并且视图弹出会有一些延迟。但总比什么都没有好

此外,如果您已经支持target 24,那么在最新的support lib 24.0.0中似乎有一个错误修复


您解决了这个问题吗?看来我也有同样或非常相似的问题。它发生在我使用RemoveAllView时。如果我不使用removeAllViews,那么它可以工作。@peshkira-nope。我放弃了哦,不:/。。。这似乎是底部工作表的布局生命周期问题,因为调试器说,视图是为我插入的。“但我没有看到它们。”佩什凯拉对我来说,使用或不使用RemoveAllView并不重要。你试过xml截图了吗?如果是,你能在那里看到他们吗?是的。易居
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) {

  }
});