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

2 回答 2

5

mViewContent应该将参数添加到您的父视图中,假设您有父视图,LinearLayout那么LinearLayout.LayoutParams必须使用。

解释:-

以 和 为例LinearLayout.LayoutParamsRelativeLayout.LayoutParams它们是不同的独立类。它们存储有关子视图的不同附加信息……比如说……

  • LinearLayout.LayoutParams可以将权重值与每个视图相关联,而RelativeLayout.LayoutParams不能。
  • RelativeLayout.LayoutParamsalightWithParent每个视图都可以有, above,之类的值,belowLinearLayout.LayoutParams不能。

虽然代码不会给出编译时错误,因为它们LayoutParams都有相同的父类,即ViewGroup.LayoutParams. Layout因此,为父布局分配参数始终是必不可少的。

于 2013-07-10T05:50:03.910 回答
0

确保您导入了正确的布局参数

import android.widget.LinearLayout.LayoutParams;
于 2013-07-02T12:27:41.377 回答