4

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 -->
Community
  • 1
  • 1
George
  • 3,384
  • 5
  • 40
  • 64

2 Answers2

5

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

General Grievance
  • 4,555
  • 31
  • 31
  • 45
CRUSADER
  • 5,486
  • 3
  • 28
  • 64
0

make sure you imported the correct layout params

import android.widget.LinearLayout.LayoutParams;
Kosh
  • 6,140
  • 3
  • 36
  • 67
  • No, still crash when `import android.widget.LinearLayout.LayoutParams;` is added but the `LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(480, 800);` left intact. @CRUSADER told me to change `LinearLayout` into `FrameLayout`, that is, `FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(480, 800);`, thus, without `import android.widget.LinearLayout.LayoutParams;` it works without any crash. – George Jul 02 '13 at 12:51