web-dev-qa-db-ja.com

FrameLayoutが使用されていない場合でも、FrameLayoutからRelativeLayoutClassCastExceptionへ

私のアプリケーションでは、実行時にプログラムでマージンを設定したい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)

どこが間違っているのですか?

17
Rajkiran

代わりに、RelativeLayout.LayoutParamsの場合はFrameLayout.LayoutParamsを設定してみてください。実行時にレイアウトパラメータを設定するときは、その親からのものを設定する必要があります。

したがって、次のようになります。

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

以前にこのエラーが発生しましたが、これは、新しいインスタンスを作成する代わりにパラメーターをキャストしようとしたためです。これがお役に立てば幸いです。

ここで:

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

@ id/rl_rootの親は、このxmlに表示されていないFrameLayoutである必要があることをお勧めします。 LayoutParamのタイプは、それ自体ではなく親と同じである必要があります。

0
Shengfeng Li