ClassCastException LinearLayout LayoutParams

Tengo una barra de acción y algunos fragmentos. El problema es mi pantalla de inicio. Hay un Fragmento de la visión en el lado izquierdo y un Fragmento del detalle en el lado derecho. Mi TabListener es dinámico, así que quiero establecer el peso de mi diseño mediante programación. Cada vez que intento obtener los Layoutparams de mi LinearLayout obtengo una 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) 

El diseño que se infla:

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

El código:

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

Lo que sucede es que los LayoutParams de una vista son realmente el tipo del padre . En este caso, obtendrá un FrameLayout$LayoutParams porque su LinearLayout está dentro de un FrameLayout.

¿Por qué es el tipo de los padres? Eso es porque almacenan información que es útil para que los padres los pongan. Si usted recuperara los parámetros de diseño para el EditText o ListView obtendría LinearLayout$LayoutParams .

Excepción indica claramente que está intentando FrameLayout a LinearLayout . Esto ocurre en el método onViewCreated() en el archivo ListSearchFragment.java, línea 184. Así que reemplace esto:

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

con este:

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

Antes de hacer eso, puede LayoutParams el puntero del ratón en LayoutParams en su código actual y ver en la burbuja que de hecho es android.widget.RelativeLayout.LayoutParams tanto, su excepción. Ver:

Introduzca aquí la descripción de la imagen

Hay otra razón (o error) para esta excepción:

Si el ID de la vista también se está utilizando en otro diseño, intentará convertir LayoutParams para las vistas Parent usadas en ambos diseños.

Solución: No utilice la misma identificación en diferentes diseños 🙂

  • Conversión de FrameLayout como mapa de bits
  • Construcción de un contenedor capaz de hacer zoom
  • El botón siempre aparece en la parte superior de FrameLayout
  • Llamar ViewGroup # addView y ViewGroup # removeView causa NullPointerException
  • La llamada requiere el nivel 23 de API: error getForeground (), pero es un método FrameLayout ya que API 1
  • Después de que el fragmento de cambio de configuración de backstack ahora está compartiendo el FrameLayout?
  • Colocar la vista dentro de FrameLayout en Android
  • ¿Cómo ordenar android Z?
  • Cómo cambiar la dirección de la sombra de elevación de Android?
  • Dos diseños de marco en el ejemplo de FragmentTabs de Android Support4Demos
  • Android: cómo escalar una imagen para llenar el fondo de un LinearLayout sin preservar la relación de aspecto?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.