TableLayout中的Android ViewSwitcher单元格神奇地移动和隐藏

时间:2013-01-13 23:33:16

标签: android android-layout android-tablelayout viewswitcher

我有一个ViewSwitcher布局,用作TableLayout中的单元格。

ViewSwitcher包含两个视图,我在第一个子节点上实现了一个OnClickListener,以便在点击时切换视图。

问题是当单击TableRow的一个单元格时,视图会被切换,但同一行中的所有其他单元格都会神奇地调整大小。

  • 示例1:

视图显示:

no action screen

当我点击左边的单元格时,它会给出:

select left cell

当我最后点击右边的单元格时,它会给出:

select right cell

  • 示例2:

视图显示:

no action screen

当我点击右边的单元格时,它会给出:

select right cell

当我最后点击左边的单元格时,它会给出:

select left cell

我的截图质量不是很高,但可以看到未被点击的单元格被截断,好像它是从几个像素的父视图下移动的。

证据是底部没有显示绿色边框。

我已经截取了层次结构查看器的屏幕截图,例如这里的第1步:

enter image description here

  • 背景上带有细红色边框的大矩形是表格行。
  • 左侧带有白色边框的矩形是单击的单元格(ViewSwitcher)。
  • 带有强红色边框的红色矩形是混乱的单元格(ViewSwitcher)。

所以你可以看到它被移动了几个像素位于其原始位置之下,这使得在表格行的顶部有一个空白区域,并且单元格的底部是不可见的。

我真的不知道发生了什么,如果你有想法或者你想尝试,这里是代码:

活动:

package my.app;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.ViewSwitcher;

public class SampleActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        LayoutInflater mInflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        TableLayout table = (TableLayout) mInflater.inflate(R.layout.content, null);
        TableRow row = new TableRow(this);

        ViewSwitcher cell1 = (ViewSwitcher) mInflater.inflate(R.layout.cell, null);
        cell1.findViewById(R.id.cell_view).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                ((ViewSwitcher) v.getParent()).showNext();
            }
        });
        row.addView(cell1);

        ViewSwitcher cell2 = (ViewSwitcher) mInflater.inflate(R.layout.cell, null);
        cell2.findViewById(R.id.cell_view).setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                ((ViewSwitcher) v.getParent()).showNext();
            }
        });
        row.addView(cell2);

        table.addView(row);
        setContentView(table);
    }
}

布局content.xml:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/content"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
</TableLayout>

布局cell.xml:

<?xml version="1.0" encoding="utf-8"?>
<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/cell"
    android:layout_width="fill_parent"
    android:layout_height="50dp"
android:background="@drawable/cellborder"
android:padding="1px"
    >
    <TextView
        android:id="@+id/cell_view"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:background="@drawable/select"
        android:text="TextView" />
    <EditText
        android:id="@+id/cell_edit"
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:hint="EditText" />
</ViewSwitcher>

如果您还想要颜色,还有抽奖:

border.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape= "rectangle"
    >
    <solid android:color="#FFFFFFFF"/>
    <stroke android:width="1dp"  android:color="@android:color/holo_green_light"/>
</shape>

select.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true" >
        <shape>
            <gradient
                android:startColor="@android:color/white"
                android:endColor="@android:color/white"/>
        </shape>
    </item>

    <item android:state_focused="true" android:state_pressed="true">
        <shape>
            <gradient
                android:startColor="@android:color/holo_blue_light"
                android:endColor="@android:color/holo_blue_dark"/>
        </shape>
    </item>

    <item android:state_pressed="true">
        <shape>
            <gradient
                android:startColor="@android:color/holo_green_light"
                android:endColor="@android:color/holo_green_dark"/>
        </shape>
    </item>

    <item>
        <shape>
            <gradient
                android:startColor="@android:color/holo_orange_light"
                android:endColor="@android:color/holo_orange_dark"/>
        </shape>
    </item>
</selector>

1 个答案:

答案 0 :(得分:2)

我使用线性布局包围了cell.xml中的每个组件,它修复了您的问题。试一试:

   <?xml version="1.0" encoding="utf-8"?>
   <ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/cell"
   android:layout_width="fill_parent"
   android:layout_height="50dp"
   android:background="@drawable/cellborder"
   android:padding="1px" >

   <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" >


   <TextView
       android:id="@+id/cell_view"
       android:layout_width="fill_parent"
       android:layout_height="50dp"
       android:background="@drawable/select"
       android:text="TextView" />

   </LinearLayout>

   <LinearLayout
       android:layout_width="fill_parent"
       android:layout_height="fill_parent" >

           <EditText
           android:id="@+id/cell_edit"
           android:layout_width="fill_parent"
           android:layout_height="50dp"
           android:hint="EditText" />
    </LinearLayout>

</ViewSwitcher>