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

Reply via email to