首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ClassCastException LinearLayout LayoutParams

ClassCastException LinearLayout LayoutParams
EN

Stack Overflow用户
提问于 2012-12-22 23:35:13
回答 3查看 17K关注 0票数 10

我有一个动作条和一些碎片。问题出在我的主屏幕上。左侧有一个概述片段,右侧有一个详细片段。我的TabListener是动态的,所以我想通过编程来设置布局的权重。每当我尝试获取我的LinearLayout的布局参数时,我都会得到一个ClassCastException:

代码语言:javascript
复制
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)

被膨胀的布局:

代码语言:javascript
复制
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:id="@+id/container_found_list_overview">

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

</LinearLayout> 

代码:

代码语言:javascript
复制
            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();
            }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-23 00:05:02

实际情况是视图的LayoutParams实际上是父视图的类型。在本例中,您将获得一个FrameLayout$LayoutParams,因为您的LinearLayout位于FrameLayout中。

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

票数 32
EN

Stack Overflow用户

发布于 2012-12-22 23:43:39

Exception清楚地表明您正在尝试将FrameLayout强制转换为LinearLayout。这发生在ListSearchFragment.java文件第184行的onViewCreated()方法中。因此,请替换以下内容:

代码语言:javascript
复制
LayoutParams lp = (LayoutParams) myView.getLayoutParams();

有了这个:

代码语言:javascript
复制
LinearLayout.LayoutParams lp = 
                  (LinearLayout.LayoutParams) myView.getLayoutParams();

在此之前,您可以将鼠标指针悬停在当前代码中的LayoutParams上,并在气泡中看到它实际上是android.widget.RelativeLayout.LayoutParams,因此出现了您的异常。请参见:

票数 1
EN

Stack Overflow用户

发布于 2015-02-24 18:31:11

这个异常还有另一个原因(或bug):

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14004063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档