在不移动其他视图的情况下展开LinearLayout中的一个视图

时间:2011-03-31 12:46:37

标签: android android-widget android-ui

我有一个垂直的LinearLayout,彼此之间有2个视图。 顶视图应该是可展开的面板 - 如果单击,它应该向下展开,但不会影响其他视图。 我希望底部视图始终由顶视图的“封闭”版本对齐。 顶视图应该为打开的版本设置动画,因此我不能只隐藏打开的版本。

你将如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

LinearLayout不允许您要求的内容。没有一组布局参数允许LinearLayout中的子项重叠。

您可以使用FrameLayout。这里的诀窍是让布局恰到好处。这是一个如何做到这一点的例子。具有顶视图和底视图ID的ImageView是您关注的视图,其余的是将视图放在您想要的位置的结构。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
<LinearLayout 
        android:orientation="vertical" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">
        <ImageView
            android:layout_width="fill_parent"
            android:layout_height="70dip" />
        <ImageView
            android:id="@+id/bottomview"
            android:layout_width="fill_parent"
            android:layout_height="0dip"
            android:layout_weight="1"
            android:background="#FFFF0000"/>
</LinearLayout>
<ImageView
            android:id="@+id/topview"
            android:layout_width="fill_parent"
            android:layout_height="70dip" 
            android:background="#FF00FF00"/>
</FrameLayout>

然后你只需要在顶视图中添加一个onClick监听器并更改布局参数。例如,这是一个扩展视图的快速示例。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        ImageView i=(ImageView)findViewById(R.id.topview);
        i.setOnClickListener(new OnClickListener() {            
            @Override
            public void onClick(View v) {
                // Make the view bigger
                FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,300);
                v.setLayoutParams(lp);
                v.invalidate();
            }
        });

... more code...

其余的将是添加代码以跟踪展开/折叠状态并添加动画。

希望有所帮助。