Android ClassCastException LinearLayout布局参数
我有一个动作条和一些片段。问题是我的主屏幕。左侧有一个概述片段,右侧有一个详细片段。我的TabListener是动态的,所以我想通过编程设置布局的权重。每当我尝试获取LinearLayout的Layoutparams时,我会得到一个ClassCastException:Android ClassCastException LinearLayout布局参数,android,android-linearlayout,classcastexception,android-framelayout,Android,Android Linearlayout,Classcastexception,Android Framelayout,我有一个动作条和一些片段。问题是我的主屏幕。左侧有一个概述片段,右侧有一个详细片段。我的TabListener是动态的,所以我想通过编程设置布局的权重。每当我尝试获取LinearLayout的Layoutparams时,我会得到一个ClassCastException: 12-22 16:00:37.620: W/System.err(7235): java.lang.ClassCastException: android.widget.FrameLayout$LayoutParams cann
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_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>
异常明确表示您正试图将
FrameLayout
强制转换为LinearLayout
。这发生在ListSearchFragment.java文件第184行的onViewCreated()
方法中。因此,请将其替换为:
LayoutParams lp = (LayoutParams) myView.getLayoutParams();
为此:
LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams) myView.getLayoutParams();
在此之前,您可以将鼠标指针悬停在当前代码中的LayoutParams
上,并在bubble中看到它实际上是android.widget.RelativeLayout.LayoutParams
,因此是您的异常。见:
发生的是视图的LayoutParams实际上是父视图的类型。在本例中,您将获得一个
FrameLayout$LayoutParams
,因为您的LinearLayout位于FrameLayout内部
为什么是父母的类型?这是因为它们存储的信息对家长布置它们很有用。如果要检索EditText或ListView的布局参数,您将获得LinearLayout$LayoutParams
此异常还有另一个原因(或错误):
如果视图的ID也在另一个布局中使用,那么它将尝试为两个布局中使用的父视图强制转换LayoutParams
解决方案:不要在不同的布局中使用相同的id:)非常感谢,现在可以正常工作了。我用布局重力代替布局重量,动态改变宽度。好的,谢谢你的建议。我在stackoverflowSo的第一个问题,那正确的解决方案是什么?例如,如果我想向嵌套在相对布局中的线性布局添加上边距,则应使用
RelativeLayout.LayoutParams
。这是行不通的。完全相同的例外。看看上面公认的答案——根本不可能。如果知道我错了,我会很高兴的
LinearLayout.LayoutParams lp =
(LinearLayout.LayoutParams) myView.getLayoutParams();