ClassCastException LinearLayout LayoutParams

У меня есть панель действий и некоторые фрагменты. Проблема – мой Homescreen. На правой стороне находится фрагмент обзора с левой стороны и фрагмент детали справа. Моя вкладка TabListener – динамическая, поэтому я хочу установить вес моего макета программно. Всякий раз, когда я пытаюсь получить Layoutparams моего LinearLayout, я получаю 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_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> 

Код:

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

Solutions Collecting From Web of "ClassCastException LinearLayout LayoutParams"

Что происходит, так это то, что LayoutParams вида на самом деле является типом родителя . В этом случае вы получаете FrameLayout$LayoutParams потому что ваш LinearLayout находится внутри FrameLayout.

Почему это тип родителя? Это потому, что они хранят информацию, которая полезна родителям для их выкладки. Если вы хотите получить параметры макета для EditText или ListView, вы получите LinearLayout$LayoutParams .

Исключение явно указывает, что вы пытаетесь использовать FrameLayout для LinearLayout . Это происходит в onViewCreated() в файле ListSearchFragment.java, строка 184. Так что замените это:

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

с этим:

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

Прежде чем вы это сделаете, вы можете LayoutParams указатель мыши на LayoutParams в вашем текущем коде и увидеть в пузырьке, что на самом деле это android.widget.RelativeLayout.LayoutParams следовательно, ваше исключение. Видеть:

Введите описание изображения здесь

Существует и другая причина (или ошибка) для этого исключения:

Если идентификатор вида также используется в другом макете, он попытается использовать LayoutParams для представлений Parent, используемых в обоих макетах.

Решение: Не используйте тот же идентификатор в разных макетах 🙂