即使没有使用FrameLayout,FrameLayout也会返回RelativeLayout ClassCastException

在我的应用程序中,我有一个具有RelativeLayout的布局,我希望在运行时以编程方式设置边距。 但是当我这样做时,它给了我ClassCastExceptionFrameLayout不能转换为RelativeLayout 。 我没有使用任何FrameLayout,也没有FrameLayout导入。 问题仍然存在。 我正在使用的XML是:

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

这是我的onCreate,我把边距设置为父布局:

 /** 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); } 

这里是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) 

我哪里错了?

Solutions Collecting From Web of "即使没有使用FrameLayout,FrameLayout也会返回RelativeLayout ClassCastException"

尝试设置FrameLayout.LayoutParams,而不是RelativeLayout.LayoutParams。 在运行时设置布局参数时,必须从父项设置。

所以,这将是:

 FrameLayout.LayoutParams _rootLayoutParams = new FrameLayout.LayoutParams(_rootLayout.getWidth(), _rootLayout.getHeight()); _rootLayoutParams.setMargins(300, 0, 300, 0); _rootLayout.setLayoutParams(_rootLayoutParams); 

我曾经有过这个错误,这是因为我试图转换参数,而不是创build一个新的实例。 我希望这有帮助。

就在这儿 :

 RelativeLayout.LayoutParams _rootLayoutParams = new RelativeLayout.LayoutParams(_rootLayout.getWidth(), _rootLayout.getHeight()); 

应该:

 RelativeLayout.LayoutParams _rootLayoutParams = new RelativeLayout.LayoutParams(_rootLayout.getLayoutParams()); 

现在,您已经拥有父级(根)布局的所有布局参数,您可以使用它们来设置您正在膨胀的子视图的参数。

 // 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); 

我build议@ id / rl_root的父级必须是FrameLayout,而不是在这个xml中显示。 LayoutParam的types应该与其父类不一样。