FrameLayout для RelativeLayout ClassCastException, даже если не используется FrameLayout

В моем приложении у меня есть макет, который имеет 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)

Где я иду не так?

Ответы

Ответ 1

Попробуйте установить FrameLayout.LayoutParams вместо этого, если RelativeLayout.LayoutParams. Когда вы устанавливаете параметры макета во время выполнения, вы должны установить из него родительские.

Итак, это будет:

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

Ответ 2

У меня была эта ошибка один раз раньше, и это было потому, что я пытался использовать параметры вместо создания нового экземпляра. Надеюсь, это поможет.

Прямо здесь:

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

Ответ 3

Я предлагаю, чтобы родительский элемент @id/rl_root должен быть FrameLayout, который не отображается в этом xml. Тип LayoutParam должен быть одинаковым с его родителем, а не с самим собой.