gpt4 book ai didi

android - 底部行为 subview 更改并不总是有效

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:40 25 4
gpt4 key购买 nike

在我的 Activity 中,我有带标记的 map 。当用户点击标记时,它会在底页显示有关该地点的详细信息。

当 View 首次填充有关地点的数据时,它可以正常工作。但是在隐藏 bottomsheet 之后,再次单击后显示它不能正常工作:TextView 保存旧高度(view.invalidate() 不起作用)。viewGroup.addView 方法不起作用(在添加之前调用 viewGroup.removeAllViews(),但它保持旧高度并且添加 View 不起作用)。

但是当我在不隐藏/显示 bottomSheet 的情况下更改 View 数据时,一切正常。喜欢第一次改变。

我在调试时也看到了其他奇怪的行为:我有 linearLayout,它有 4 个 relativeLayouts(里面有 textView 和 imageView)。当我更改一个/两个的可见性(消失/可见)时,它们会相互重叠,即使 linearLayout 具有垂直方向。但并非总是如此,就像上面一样:第一次工作正常,其他时候如果我在 bottomSheet 不可见时更改 View 不能正常工作(如上所述),但是当 bottomBehavior 可见并且如果我更改 View 它工作正常(就像第一次时间)。

如果我没记错的话,那是因为 bottomsheet。因为,我以前在 Android 上没有看到这种 View 行为。

我的代码:

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

我很难解释这个,但这个问题让我发疯了几天。非常感谢您提供的任何帮助!

最佳答案

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

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

}
});

它仍然不完美,因为新的 Layout 需要一些时间来渲染并且 View 弹出时会有一些延迟。但聊胜于无。

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

https://code.google.com/p/android/issues/detail?id=205226

关于android - 底部行为 subview 更改并不总是有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37895137/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com