2013-01-13 44 views
2

我有一個ViewSwitcher佈局,用作TableLayout中的單元格。TableLayout中的Android ViewSwitcher單元奇蹟般地移動和隱藏

ViewSwitcher包含兩個視圖,我在第一個孩子上實現了一個OnClickListener,以便在點擊上切換視圖。

問題是,當單擊TableRow中的一個單元格時,切換視圖,但是同一行上的所有其他單元格都被神奇地調整大小。

  • 實施例1:

該視圖顯示:

no action screen

當我點擊左單元它給出:

select left cell

當我最後點擊o n中的右單元它給出:

select right cell

  • 實施例2:

該視圖顯示:

no action screen

當我點擊右單元它給出:

select right cell

而當我終於點擊左側單元它給:

select left cell

我的屏幕截圖素質不是很高,但可以看到,尚未單擊單元格被截斷,如果它在父視圖下從幾個像素向下移動。

證明是綠色邊框不顯示在底部。

我已經採取了層次觀衆的截圖例如1步2瀏覽:

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); 
    } 
} 

佈局的內容。 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> 

回答

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> 
+0

工程就像一個魅力謝謝!任何想法爲什麼這個線性佈局固定它? – Arnaud

+0

我的假設是視圖不是封裝在一個容器周圍,因此將不受限制地移動。線性佈局確保它保持在定義的範圍內。 – GKproggy