LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

102,778

Solution 1

I ran into a similar problem and I found the answer here. Basically, you should choose the LayoutParams depending on the parent, in your case new LinearLayout.LayoutParams should be new RelativeLayout.LayoutParams.

Solution 2

You should not make the LayoutParmas object of the layout whose dimension you want to set from java. Rather you should make the LayoutParams object of the parent layout. For example in the layout below to set the layout params of the LinearLayout you have to make the LayoutParmas of RelativeLayout not LinearLayout itself:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
    tools:context=".newsblog.NewsDetailsActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</RelativeLayout>

In activity class:

RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(30,30); // parent params
linearLayout.setLayoutParmas(params); // child layout

If you want to set the params of the RelativeLayout, it seems it doesn't have any parent but it has a parent created by android framework which is a frame layout:

FrameLayout.LayoutParmas params = new FrameLayout.LayoutParmas(30, 30); // FrameLayout is a parent-created by android framework
relativeLayout.setLayoutParmas(params); // relative layout is child here

Solution 3

Try doing a clean of your project. You must have copy pasted a block of xml from a FrameLayout and changed the tag. This is a nasty bug in android.

There was a similar issue on another discussion. I hope this is the same cause.

Solution 4

Try this:

  LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(this.mainview.getWidth(),       this.mainview.getHeight());
  params.setMargins(left, top, right, bottom);
  this.mainview.setLayoutParams(params);

This may be help.

Solution 5

Above error due to passing wrong casting params :- because some time you set programattically parameter for linear layout but when you doing getLayoutParams() then it some time gives parent layout reference then it is gives above error .

FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) parentLayout.getLayoutParams();
        int leftMargin = (int) getResources().getDimension(R.dimen.exclusion_card_margin_left_right);
        int rightMargin = (int) getResources().getDimension(R.dimen.exclusion_card_margin_left_right);

        params.setMargins(leftMargin, 0, rightMargin, 0);
        parentLayout.setLayoutParams(params);
Share:
102,778
Dani
Author by

Dani

Updated on December 02, 2020

Comments

  • Dani
    Dani over 3 years

    Explanation and solution at the bottom.

    I am developing one slider layout animation, the animation work fine but when all processes end, they get next Exception.

    I guess RelativeLayout parent have something to do in exception, but I don't know how to resolve it.

    09-06 11:24:58.952: E/Trace(30884): error opening trace file: No such file or directory (2)
    09-06 11:25:09.113: E/AndroidRuntime(30884): FATAL EXCEPTION: main
    09-06 11:25:09.113: E/AndroidRuntime(30884): java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:311)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4916)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2161)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.View.measure(View.java:15264)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2129)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1240)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1433)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1125)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4607)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:747)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer.doCallbacks(Choreographer.java:567)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer.doFrame(Choreographer.java:536)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:733)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.os.Handler.handleCallback(Handler.java:615)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.os.Handler.dispatchMessage(Handler.java:92)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.os.Looper.loop(Looper.java:153)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at android.app.ActivityThread.main(ActivityThread.java:5086)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at java.lang.reflect.Method.invokeNative(Native Method)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at java.lang.reflect.Method.invoke(Method.java:511)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:821)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
    09-06 11:25:09.113: E/AndroidRuntime(30884):    at dalvik.system.NativeStart.main(Native Method)
    

    activity_home.xml

    <RelativeLayout 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" >
    
        <LinearLayout
            android:id="@+id/leftView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#cad000"
            android:orientation="vertical" >
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/mainView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#876000"
            android:orientation="vertical" >
    
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="50dp"
                android:background="#cecece"
                android:orientation="horizontal" >
    
                <Button
                    android:id="@+id/btnSlide"
                    style="@style/btn1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="X" />
            </LinearLayout>
        </LinearLayout>
    
    </RelativeLayout>
    

    Activity

    public class HomeActivity extends Activity implements OnClickListener {
    
        UserStorage userStorage = new UserStorage();
    
        private Button btnSlide;
        private LinearLayout mainView, leftView;
        private SliderAnimation slideAnimation;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_home);
    
            this.leftView = (LinearLayout) findViewById(R.id.leftView);
            this.mainView = (LinearLayout) findViewById(R.id.mainView);
    
            this.btnSlide = (Button) findViewById(R.id.btnSlide);
            this.btnSlide.setOnClickListener(this);
    
            this.slideAnimation = new SliderAnimation(this);
    
            this.slideAnimation.initializeFilterAnimations(this.mainView, this.leftView);
        }
    
        @Override
        public void onClick(View v) {
    
            switch (v.getId()) {
    
            case R.id.btnSlide:
    
                this.slideAnimation.toggleLeftSliding();
    
                break;
            }
        }
    }
    

    AnimationListener

    public class SliderAnimation implements AnimationListener {
    
        private Context context;
    
        private LinearLayout mainView, leftView;
    
        private Animation mainSlideIn, mainSlideOut;
    
        private boolean leftAnimated, rightAnimated = false;
    
        private int deviceWidth;
    
        public SliderAnimation(Context context) {
    
            this.context = context;
    
            DisplayMetrics displayMetrics = context.getResources()
                    .getDisplayMetrics();
    
            this.deviceWidth = displayMetrics.widthPixels;
        }
    
        public void initializeFilterAnimations(LinearLayout mainView,
                LinearLayout leftView) {
    
            this.mainView = mainView;
            this.leftView = leftView;
    
            this.mainSlideIn = AnimationUtils.loadAnimation(context,
                    R.anim.main_slide_in);
            this.mainSlideIn.setAnimationListener(this);
    
            this.mainSlideOut = AnimationUtils.loadAnimation(context,
                    R.anim.main_slide_out);
            this.mainSlideOut.setAnimationListener(this);
        }
    
        public void toggleLeftSliding() {
    
            if (!this.leftAnimated) {
    
                this.mainView.startAnimation(this.mainSlideIn);
            } else {
    
                this.mainView.startAnimation(this.mainSlideOut);
            }
        }
    
        @Override
        public void onAnimationEnd(Animation animation) {
    
            if (!this.leftAnimated) {
    
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                        (this.deviceWidth * 20) / 100, this.mainView.getHeight());
    
                params.leftMargin = (this.deviceWidth * 80) / 100;
    
                this.mainView.setLayoutParams(params);
    
                this.leftAnimated = true;
            } else {
    
                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                        this.deviceWidth, this.mainView.getHeight());
    
                params.leftMargin = 0;
    
                this.mainView.setLayoutParams(params);
    
                this.leftAnimated = false;
            }
        }
    
        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    
        @Override
        public void onAnimationStart(Animation animation) {
        }
    }
    

    Thank you in advance.

    EXPLANATION AND SOLUTION

    We've to know the parent ViewGroup container for the view, because views are filled with their parent LayoutParams for measure purposes.

    If we don't know through a simple glance on the xml which is the parent ViewGroup for the View, we can get always its reference with .getParent() method from the View instance.