无法将LinearLayout $ LayoutParams强制转换为android.widget.FrameLayout $ LayoutParams [英] LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

查看:98
本文介绍了无法将LinearLayout $ LayoutParams强制转换为android.widget.FrameLayout $ LayoutParams的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

底部的说明和解决方案.

我正在开发一个滑块布局动画,该动画可以正常工作,但是当所有进程结束时,它们将获得下一个异常.

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

我想 RelativeLayout 父级有例外要做,但我不知道如何解决.

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

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>

活动

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

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

谢谢.

解释和解决方案

我们必须知道该视图的父ViewGroup容器,因为视图出于测量目的而被其父LayoutParams填充.

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

如果我们一眼不知道作为View的父ViewGroup的xml,则可以始终从View实例中使用.getParent()方法获取其引用.

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.

推荐答案

我遇到了类似的问题,发现答案在这里.基本上,应该根据父项选择LayoutParams,在这种情况下, new LinearLayout.LayoutParams 应该是 new RelativeLayout.LayoutParams .

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.

这篇关于无法将LinearLayout $ LayoutParams强制转换为android.widget.FrameLayout $ LayoutParams的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆