I've posted this question to
StackOverflow<http://stackoverflow.com/questions/12776557/classcastexception-of-layoutparams-to-marginlayoutparams-after-setting-a-views>,
but no answer there yet, so I thought I'd ask here as well.
I've written a small proxy class so that I can use ObjectAnimator to
animate a view's margin. After checking that this worked and everything
animated properly, I wanted to adjust the view's size before the animation,
but after I set the width, my animation fails with a ClassCastException. I
haven't a clue why.
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.LayoutParamslp =
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(); } } }
And the error:
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)
What am I doing wrong and why would setting the margins just not work after
setting a width?
--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en