【问题标题】:LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParamsLinearLayout$LayoutParams 无法转换为 android.widget.FrameLayout$LayoutParams
【发布时间】:2013-09-06 10:46:14
【问题描述】:

说明及解决方法见底部。

我正在开发一个滑块布局动画,动画效果很好,但是当所有进程结束时,它们会得到下一个异常。

我猜RelativeLayoutparent 有异常的事情要做,但我不知道如何解决。

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>

活动

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;
        }
    }
}

动画监听器

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 用于测量目的。

如果我们不能通过简单的浏览来了解作为 View 的父 ViewGroup 的 xml,我们总是可以使用 .getParent() 方法从 View 实例中获取它的引用。

【问题讨论】:

  • 这是正确答案stackoverflow.com/questions/10045360/…>?

标签: android


【解决方案1】:

我遇到了类似的问题,我找到了the answer here。基本上,您应该根据父级选择 LayoutParams,在您的情况下,new LinearLayout.LayoutParams 应该是 new RelativeLayout.LayoutParams

【讨论】:

  • 很高兴知道,您解决了我的问题,我试图将约束添加到子项而不是父项。现在它就像一个魅力。
  • 哦……父母。说得通。是根据自己的类型设置它,这是一个不同类型的 ViewGroup(即:LinearLayout,父级是 FrameLayout)。微妙!
【解决方案2】:

您不应该创建要从 java 设置其尺寸的布局的 LayoutParmas 对象。相反,您应该创建父布局的 LayoutParams 对象。例如,在下面的布局中,要设置 LinearLayout 的布局参数,您必须使 RelativeLayoutLayoutParmas 不是 LinearLayout 本身:

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

在活动类中:

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

如果你想设置RelativeLayout的参数,它似乎没有任何父级,但它有一个由android框架创建的父级,它是一个框架布局:

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

【讨论】:

  • 这是正确的答案。我将 RelativeLayout.LayoutParams 更改为 FrameLayout.LayoutParams 然后问题就解决了。
【解决方案3】:

尝试清理您的项目。您必须已从 FrameLayout 复制粘贴了一块 xml 并更改了标签。这是android中的一个讨厌的错误。

在另一个讨论中也有类似的问题。我希望这是同样的原因。

【讨论】:

  • 我必须做的究竟是什么?,1º剪切哪个代码位?。 2º清理项目并再次粘贴剪切代码位?
  • 在你的 Eclipse 菜单上:Project -> Clean... 重新运行你的应用程序。该错误应该会消失。
  • 你好@Chad,你的解决方案不起作用,同样的错误仍然存​​在...... :(
  • 先生,我尝试根据您的代码重新创建您的应用程序,但注释掉了 initializeFilterAnimations(),因为您没有提供这些代码并且您的应用程序运行良好。所以我认为你从来没有像我说的那样重建你的应用程序。
【解决方案4】:

试试这个:

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

这可能会有帮助。

【讨论】:

  • 感谢您的关注,但不工作,得到同样的例外。
  • LayoutParams 参数 = (LayoutParams) this.mainview.getLayoutParams(); params.setMargins(左,上,右,下); this.mainview.setLayoutParams(params);
  • 没什么...您的方法有些错误。我之前看过那个链接,但其他情况也有同样的例外。
  • 我猜你已经声明了另一个同名的布局。
【解决方案5】:

由于传递了错误的转换参数而导致上述错误:- 因为有时您为线性布局设置了编程参数,但是当您执行 getLayoutParams() 时,它有时会给出父布局参考,然后给出上述错误。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多