ClassCastException LinearLayout LayoutParams

Posted

技术标签:

【中文标题】ClassCastException LinearLayout LayoutParams【英文标题】: 【发布时间】:2012-12-09 20:32:09 【问题描述】:

我有一个操作栏和一些片段。问题是我的主屏幕。左侧有一个概览片段,右侧有一个详细片段。我的 TabListener 是动态的,所以我想以编程方式设置布局的权​​重。每当我尝试获取我的 LinearLayout 的 Layoutparams 时,我都会得到一个 ClassCastException:

12-22 16:00:37.620: W/System.err(7235): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cannot be cast to android.widget.LinearLayout$LayoutParams
12-22 16:00:37.625: W/System.err(7235):     at com.coover.eu.lostandfound.ListSearchFragment.onViewCreated(ListSearchFragment.java:184)
12-22 16:00:37.625: W/System.err(7235):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:884)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1080)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:622)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1416)
12-22 16:00:37.630: W/System.err(7235):     at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:505)
12-22 16:00:37.630: W/System.err(7235):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
12-22 16:00:37.635: W/System.err(7235):     at android.app.Activity.performStart(Activity.java:5216)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2083)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread.access$700(ActivityThread.java:140)
12-22 16:00:37.635: W/System.err(7235):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
12-22 16:00:37.640: W/System.err(7235):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-22 16:00:37.640: W/System.err(7235):     at android.os.Looper.loop(Looper.java:137)
12-22 16:00:37.640: W/System.err(7235):     at android.app.ActivityThread.main(ActivityThread.java:4921)
12-22 16:00:37.640: W/System.err(7235):     at java.lang.reflect.Method.invokeNative(Native Method)
12-22 16:00:37.640: W/System.err(7235):     at java.lang.reflect.Method.invoke(Method.java:511)
12-22 16:00:37.645: W/System.err(7235):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
12-22 16:00:37.645: W/System.err(7235):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
12-22 16:00:37.645: W/System.err(7235):     at dalvik.system.NativeStart.main(Native Method)

膨胀的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" 
    android:id="@+id/container_found_list_overview">

    <EditText android:id="@+id/search_box" 
        android:layout_
        android:layout_
        android:padding="5dp"
        android:textSize="35sp"
        android:hint="@string/search"
        android:inputType="text"
        android:maxLines="1"/>
    <ListView 
        android:layout_
        android:layout_
        android:id="@+id/overview_list_view">
    </ListView>

</LinearLayout> 

代码:


            LinearLayout myView = (LinearLayout)this.getView().findViewById(R.id.container_found_list_overview);
            Log.d("found container", ""+(myView != null));
            try
                LayoutParams lp = (LayoutParams) myView.getLayoutParams();
                lp.weight = 1;
                lp.width = 0;
                myView.setLayoutParams(lp);
            
            catch(RuntimeException e)
                Log.e("cant get layoutparams",e.getMessage());
                e.printStackTrace();
            

【问题讨论】:

Getting ClassCastException when trying to insert RelativeLayout dyanmically? 的可能重复项 【参考方案1】:

发生的事情是视图的 LayoutParams 实际上是 parent 的类型。在这种情况下,您将获得 FrameLayout$LayoutParams,因为您的 LinearLayout 在 FrameLayout 内。

为什么它是父母的类型?那是因为它们存储了对父级布局有用的信息。如果您要检索 EditText 或 ListView 的布局参数,您会得到LinearLayout$LayoutParams

【讨论】:

非常感谢它现在工作正常。而不是 layout_weight 我使用 layout_gravity 并动态更改宽度 好的,谢谢您的建议。我在 *** 上的第一个问题 那么,什么是正确的解决方案呢?例如,如果我想为嵌套在相对布局中的线性布局添加上边距? 你应该使用RelativeLayout.LayoutParams。 Source【参考方案2】:

异常清楚地表明您正在尝试将FrameLayout 转换为LinearLayout。这发生在 ListSearchFragment.java 文件第 184 行的 onViewCreated() 方法中。所以替换它:

LayoutParams lp = (LayoutParams) myView.getLayoutParams();

用这个:

LinearLayout.LayoutParams lp = 
                  (LinearLayout.LayoutParams) myView.getLayoutParams();

在您这样做之前,您可以将鼠标指针悬停在当前代码中的 LayoutParams 上,并在气泡中看到它实际上是 android.widget.RelativeLayout.LayoutParams,因此您的例外。见:

【讨论】:

那行不通。完全相同的例外。查看上面接受的答案-根本不可能。我会很高兴知道我错了。【参考方案3】:

此异常还有另一个原因(或错误):

如果视图的 ID 也在另一个布局中使用,那么它会尝试为两个布局中使用的父视图转换 LayoutParams。

解决方案:不要在不同的布局中使用相同的 id :)

【讨论】:

以上是关于ClassCastException LinearLayout LayoutParams的主要内容,如果未能解决你的问题,请参考以下文章

PySpark:java.lang.ClassCastException

应用 PathProperties 后的 ClassCastException

MIUI 11/12 主题切换导致 LifeCycleException、ClassCastException

ClassCastException 发生在 onRestoreInstanceState

Java HashMap导致ClassCastException

用 Java Lambda 编写的 Spark UDF 引发 ClassCastException