Crash when setting parameter to layout in Android
android, java, user-interface
Solution
`mViewContent` params should be added with resp to your Parent view, suppose you have parent view as `LinearLayout` then, `LinearLayout.LayoutParams` must be used.
Explanation (Adapted from here):-
Take for example, `LinearLayout.LayoutParams` and `RelativeLayout.LayoutParams`, they are different independent classes. They store different additional information about child views... say..
- `LinearLayout.LayoutParams` can associate weight value with each view, while `RelativeLayout.LayoutParams` can't.
- `RelativeLayout.LayoutParams` can have values like `alightWithParent`,`above`, `below` with each view while `LinearLayout.LayoutParams` can't.
Although the code will not give compile time error because all `LayoutParams` have same parent class i.e. `ViewGroup.LayoutParams`. So, it is always essential, to assign `Layout` params with respect to parent layout..
Problem
Expected Result Clicking on the toggle button will show up the menu and slide out the content view rightward. After animation is finished, the layout parameters of the content view gets updated to the final position. Problem When updating the final position of the content view, the statement `mViewContent.setLayoutParams(params);` causes the crash. The error message is `java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams` Source Code `Main.java > public class MainActivity extends Activity {}` ``` public void onToggleButtonMenuClicked(View view) { // Is the toggle on? boolean toggleTurnedOn = ((ToggleButton) view).isChecked(); if (toggleTurnedOn) { // If the toggle is turned on // Show menu LinearLayout mViewMenu = (LinearLayout) findViewById(R.id.linear_layout_menu); Animation animMenuOn = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_menu_on); mViewMenu.startAnimation(animMenuOn); LinearLayout mViewContent = (LinearLayout) findViewById(R.id.linear_layout_content); Animation animContentOff = AnimationUtils.loadAnimation(MainActivity.this, R.anim.anim_content_off); mViewContent.startAnimation(animContentOff); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(480, 800); params.leftMargin = 384; // Shift 384 pixels from left screen border params.rightMargin = -96; // Exceed 96 pixels from right screen border mViewContent.setLayoutParams(params); // This statement causes crash! } else { // Hide menu... } // End of toggle events handling } // End of onToggleButtonMenuClicked() ``` `activity_main.xml` ``` <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="329dp" android:layout_height="wrap_content" > <!-- The Menu View --> <LinearLayout android:id="@+id/linear_layout_menu" android:layout_width="263dp" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:id="@+id/table_row_1_search_bar" android:layout_width="match_parent" android:layout_height="40dp" android:weightSum="10" android:orientation="horizontal" > <EditText android:id="@+id/edit_text_search_id" android:layout_width="0dp" android:layout_height="40dp" android:layout_weight="7" android:hint="@string/edit_text_search_id" android:textSize="14sp" /> <Button android:id="@+id/button_search_id" android:layout_width="0dp" android:layout_height="40dp" android:layout_weight="3" android:text="@string/button_search_id" /> </LinearLayout> <!-- Other rows in the menu are omitted --> </LinearLayout> <!-- End of Menu --> <!-- The Content View --> <LinearLayout android:id="@+id/linear_layout_content" android:layout_width="329dp" android:layout_height="match_parent" android:orientation="vertical" > <ToggleButton android:id="@+id/toggle_button_menu" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onToggleButtonMenuClicked" /> <TextView android:id="@+id/text_content" android:layout_width="480dp" android:layout_height="wrap_content" android:text="@string/text_content" /> </LinearLayout> <!-- End of Content --> </FrameLayout> <!-- End of the root linear layout --> ```