FrameLayout a RelativeLayout ClassCastException incluso si no hay FrameLayout usado
En mi aplicación, tengo un diseño que tiene un RelativeLayout
al que quiero establecer márgenes en tiempo de ejecución mediante programación. Pero cuando hago eso, me da ClassCastException
diciendo que FrameLayout
no puede FrameLayout
a RelativeLayout
. No tengo ningún FrameLayout utilizado, también no hay importaciones para FrameLayout
. Sin embargo, el problema persiste. El xml que estoy usando es:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl_root" android:background="@color/menu_bg" android:layout_width="wrap_content" android:layout_height="fill_parent" > <RelativeLayout android:id="@+id/ll_lhs_menu" android:layout_width="300dip" android:layout_height="fill_parent" android:background="@color/menu_bg" android:orientation="vertical"> ..... </RelativeLayout> <RelativeLayout android:id="@+id/rl_right" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentRight="true" android:background="@drawable/capture_port" android:scrollbars="none" > .... </RelativeLayout> </RelativeLayout>
Y esta es mi onCreate donde establezco los márgenes en el diseño padre:
- ¿Alternativa a weightSum en RelativeLayout?
- Superponer una capa Transparente de pantalla completa en Android 4.4 (KitKat)
- Cómo pasar de una actividad a otra Actividad en Android
- Diseño relativo alignParentLeft vs alignParentStart
- ¿Por qué la gravedad no funciona cuando se aplica al diseño relativo?
/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.menu); _rootLayout = (RelativeLayout) findViewById(R.id.rl_root); RelativeLayout.LayoutParams _rootLayoutParams = new RelativeLayout.LayoutParams(_rootLayout.getWidth(), _rootLayout.getHeight()); _rootLayoutParams.setMargins(300, 0, 300, 0); _rootLayout.setLayoutParams(_rootLayoutParams); }
Y aquí está el LogCat:
07-18 21:12:39.410: E/AndroidRuntime(7663): FATAL EXCEPTION: main 07-18 21:12:39.410: E/AndroidRuntime(7663): java.lang.ClassCastException: android.widget.RelativeLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.widget.FrameLayout.onMeasure(FrameLayout.java:268) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.view.View.measure(View.java:10828) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.widget.LinearLayout.measureVertical(LinearLayout.java:764) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.widget.LinearLayout.onMeasure(LinearLayout.java:519) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.view.View.measure(View.java:10828) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4355) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.widget.FrameLayout.onMeasure(FrameLayout.java:267) 07-18 21:12:39.410: E/AndroidRuntime(7663): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:1912) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.view.View.measure(View.java:10828) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.view.ViewRoot.performTraversals(ViewRoot.java:960) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.view.ViewRoot.handleMessage(ViewRoot.java:2062) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.os.Handler.dispatchMessage(Handler.java:99) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.os.Looper.loop(Looper.java:132) 07-18 21:12:39.410: E/AndroidRuntime(7663): at android.app.ActivityThread.main(ActivityThread.java:4128) 07-18 21:12:39.410: E/AndroidRuntime(7663): at java.lang.reflect.Method.invokeNative(Native Method) 07-18 21:12:39.410: E/AndroidRuntime(7663): at java.lang.reflect.Method.invoke(Method.java:491) 07-18 21:12:39.410: E/AndroidRuntime(7663): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 07-18 21:12:39.410: E/AndroidRuntime(7663): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 07-18 21:12:39.410: E/AndroidRuntime(7663): at dalvik.system.NativeStart.main(Native Method)
¿A dónde me equivoco?
- Cómo alinear un elemento a la derecha de su centro de padres? (Diseños de Android)
- Z-index en Disposición relativa
- Androide - superponer imágenes (jugar a las cartas)
- ¿Cómo centrar dos vistas dentro de una disposición relativa?
- Establecer fondo de RelativeLayout con la imagen descargada con Universal Image Loader
- Diferencias RelativeLayout entre 1,5 y 2,1
- Tener un EditText sobre un teclado suave con una vista GL en el fondo mediante programación
- Android ScrollView no funciona correctamente
Intente establecer FrameLayout.LayoutParams en su lugar si RelativeLayout.LayoutParams. Cuando se configuran los params de diseño en tiempo de ejecución, hay que configurar los de su padre.
Entonces, será:
FrameLayout.LayoutParams _rootLayoutParams = new FrameLayout.LayoutParams(_rootLayout.getWidth(), _rootLayout.getHeight()); _rootLayoutParams.setMargins(300, 0, 300, 0); _rootLayout.setLayoutParams(_rootLayoutParams);
He tenido este error una vez antes y fue porque intenté emitir los parámetros en lugar de crear una nueva instancia. Espero que esto ayude.
Aquí :
RelativeLayout.LayoutParams _rootLayoutParams = new RelativeLayout.LayoutParams(_rootLayout.getWidth(), _rootLayout.getHeight());
Debiera ser:
RelativeLayout.LayoutParams _rootLayoutParams = new RelativeLayout.LayoutParams(_rootLayout.getLayoutParams());
Ahora que tiene todos los parámetros de diseño del diseño principal (raíz), puede utilizarlos para establecer los parámetros de su vista secundaria que está inflando.
// Example usage: // viewGroup is the parent in this case whose parameters we want as a reference point. RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(viewGroup.getLayoutParams()); // Now we can add a rule stating that we want to center our new view both horizontally and vertically in the parent (viewGroup) view. params.addRule(RelativeLayout.CENTER_IN_PARENT); // Add more rules here if you would like params.addRule(newRule2); // After all of your new parameters are laid out, assign them to the view you want them applied to newView.setLayoutParams(params); // Add the view to your hierarchy and enjoy viewGroup.addView(newView);
Sugiero que el padre de la @ id / rl_root debe ser FrameLayout que no se muestra en este xml. El tipo de LayoutParam debe ser el mismo con su propio padre no.
- Cambio de color de los botones DialogFragment en Lollipop
- ¿Cómo configurar el diálogo de progreso para que no se pueda cancelar cuando se administra como un fragmento?