LinearLayout $ LayoutParams nie może być rzutowany na android.widget.FrameLayout $ LayoutParams

Wyjaśnienie i rozwiązanie na dole.

Opracowuję jedną animację układu suwaka, animacja działa dobrze, ale gdy wszystkie procesy się kończą, otrzymują następny wyjątek.

zgadujęRelativeLayout rodzic ma coś wyjątkowego, ale nie wiem, jak go rozwiązać.

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)

home_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>

Czynność

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) {
    }
}

Z góry dziękuję.

WYJAŚNIENIE I ROZWIĄZANIE

Musimy znać macierzysty kontener ViewGroup dla widoku, ponieważ widoki są wypełniane ich rodzicielskimi LayoutParams dla celów pomiaru.

Jeśli nie wiemy przez prosty rzut oka na xml, który jest rodzicem ViewGroup dla widoku, zawsze możemy uzyskać jego odniesienie za pomocą metody .getParent () z instancji View.

questionAnswers(5)

yourAnswerToTheQuestion