私のアプリケーションでは、実行時にプログラムでマージンを設定したいRelativeLayout
を持つレイアウトがあります。しかし、そうすると、ClassCastException
はFrameLayout
にキャストできないと言って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)
どこが間違っているのですか?
代わりに、RelativeLayout.LayoutParamsの場合はFrameLayout.LayoutParamsを設定してみてください。実行時にレイアウトパラメータを設定するときは、その親からのものを設定する必要があります。
したがって、次のようになります。
FrameLayout.LayoutParams _rootLayoutParams = new FrameLayout.LayoutParams(_rootLayout.getWidth(), _rootLayout.getHeight());
_rootLayoutParams.setMargins(300, 0, 300, 0);
_rootLayout.setLayoutParams(_rootLayoutParams);
以前にこのエラーが発生しましたが、これは、新しいインスタンスを作成する代わりにパラメーターをキャストしようとしたためです。これがお役に立てば幸いです。
ここで:
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);
@ id/rl_rootの親は、このxmlに表示されていないFrameLayoutである必要があることをお勧めします。 LayoutParamのタイプは、それ自体ではなく親と同じである必要があります。