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