gpt4 book ai didi

android-layout - 设置 View 宽度后 LayoutParams 到 MarginLayoutParams 的 ClassCastException

转载 作者:行者123 更新时间:2023-12-04 04:30:54 27 4
gpt4 key购买 nike

我编写了一个小的代理类,以便我可以使用 ObjectAnimator 为 View 的边距设置动画。在检查这是否有效并且所有动画都正确后,我想在动画之前调整 View 的大小,但是在设置宽度之后,我的动画失败并出现 ClassCastException。我不知道为什么。

private class handleClickListener implements View.OnClickListener {
private static final int LEFT_MARGIN_VISIBLE = 0;
private static final int LEFT_MARGIN_HIDDEN = -196;

public void onClick(View view) {
LinearLayout row = (LinearLayout) view.getParent().getParent();
RelativeLayout options = (RelativeLayout) row.findViewById(R.id.options);
LayoutProxy layoutProxy = new LayoutProxy(options);

// First make sure the options are the right width to fill the screen with the handle
int rowWidth = row.getWidth();
int handleWidth = view.getWidth();
layoutProxy.setWidth(rowWidth - handleWidth);
ObjectAnimator animation;

if (layoutProxy.getLeftMargin() == Util.dipsToPixels(options, LEFT_MARGIN_VISIBLE)) {
animation = ObjectAnimator.ofInt(layoutProxy, "leftMargin", Util.dipsToPixels(view, LEFT_MARGIN_VISIBLE), Util.dipsToPixels(view, LEFT_MARGIN_HIDDEN));
} else {
animation = ObjectAnimator.ofInt(layoutProxy, "leftMargin", Util.dipsToPixels(view, LEFT_MARGIN_HIDDEN), Util.dipsToPixels(view, LEFT_MARGIN_VISIBLE));
}

animation.setDuration(200);
animation.start();
}

/**
* Allows an ObjectAnimator to set/get margins and dimensions of a view
*/
private class LayoutProxy {
private ViewGroup mView;

public LayoutProxy(View view) {
mView = (ViewGroup) view;
}

public int getWidth() {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
return lp.width;
}

public void setWidth(int width) {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
mView.setLayoutParams(new ViewGroup.LayoutParams(width, lp.height));
}

public int getHeight() {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
return lp.height;
}

public void setHeight(int height) {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
mView.setLayoutParams(new ViewGroup.LayoutParams(lp.width, height));
}

public int getLeftMargin() {
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) mView.getLayoutParams();
return lp.leftMargin;
}

public void setLeftMargin(int margin) {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
lp.setMargins(margin, lp.topMargin, lp.rightMargin, lp.bottomMargin);
mView.requestLayout();
}

public int getTopMargin() {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
return lp.topMargin;
}

public void setTopMargin(int margin) {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
lp.setMargins(lp.leftMargin, margin, lp.rightMargin, lp.bottomMargin);
mView.requestLayout();
}

public int getRightMargin() {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
return lp.rightMargin;
}

public void setRightMargin(int margin) {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
lp.setMargins(lp.leftMargin, lp.topMargin, margin, lp.bottomMargin);
mView.requestLayout();
}

public int getBottomMargin() {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
return lp.bottomMargin;
}

public void setBottomMargin(int margin) {
MarginLayoutParams lp = (MarginLayoutParams) mView.getLayoutParams();
lp.setMargins(lp.leftMargin, lp.topMargin, lp.rightMargin, margin);
mView.requestLayout();
}
}
}

和错误:
FATAL EXCEPTION: main
java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams
at com.test.data.ContactListCursorAdapter$handleClickListener$LayoutProxy.getLeftMargin(ContactListCursorAdapter.java:135)
at com.test.data.ContactListCursorAdapter$handleClickListener.onClick(ContactListCursorAdapter.java:94)
at android.view.View.performClick(View.java:4084)
at android.view.View$PerformClick.run(View.java:16966)

最佳答案

我有类似的问题

起初我使用:

LayoutParams viewFlowLayout = new LayoutParams(originalWidth, newHeight);
viewFlow.setLayoutParams(flowViewLayout);

我和你有同样的错误信息:
java.lang.ClassCastException: android.view.ViewGroup$LayoutParams cannot be cast to android.view.ViewGroup$MarginLayoutParams

我不知道为什么,因为我没有使用 MarginLayoutParams。

然后我试着把它改成这个
LayoutParams viewFlowLayout = viewFlow.getLayoutParams();
viewFlowLayout.height = newheight;
viewFlow.setLayoutParams(flowViewLayout);

错误消失了......

我猜你对上面的代码有多个用例。
例如:改变这个
public void setHeight(int height) {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
mView.setLayoutParams(new ViewGroup.LayoutParams(lp.width, height));
}


public void setHeight(int height) {
ViewGroup.LayoutParams lp = mView.getLayoutParams();
lp.height = height //width will remain and height will be change to the newHeight
mView.setLayoutParams(lp);
}

希望它对您和那里的许多人有所帮助......

关于android-layout - 设置 View 宽度后 LayoutParams 到 MarginLayoutParams 的 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12776557/

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