2010-11-24 60 views
1

每個以前的請求重新措辭......我在運行時動態添加TableLayouts。視圖大綱看起來像這樣... LinearLayout-> ScrollView-> TableLayout->在運行時循環創建TableLayouts和TableRows。所以基本上我循環和增加以下內容:setBackgroundColor導致TableLayout對齊問題

爲(i = 0 ....我++)

左                   中東                    Right

Bottom

現在一切都正確添加,看起來正確,並正確滾動。不過,我正在嘗試創建一個onTouch事件,它改變了動態創建的TableLayout上的背景。該onTouch每個動態創建的TableLayout裏面我有一個onTouch事件調用時執行以下操作:

  tableLayoutRow1.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.d("OnTouch", "OnTouch Event for " + Integer.toString(v.getId()) + " event:" + Integer.toString(event.getAction())); 

       switch(event.getAction()) 
       { 
        case MotionEvent.ACTION_DOWN: 
         Log.d("OnTouch", "Changing to GREEN"); 
         v.setBackgroundColor(Color.GRAY); 
         break; 
        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_MOVE: 
         Log.d("OnTouch", "Changing to BLACK"); 
         v.setBackgroundColor(Color.BLACK); 
         break; 
       } 

       return true; 
      } 
     }); 

每當它調用它攪亂了動態創建TableLayouts的每一個的對齊setBackgroundColor,使它們看起來像此:

LeftMiddleRight

底部

整個代碼如下。我希望現在這是清楚的。

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

    LinearLayout linearLayout = new LinearLayout(this); 
    linearLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    linearLayout.setWeightSum(1); 

    ScrollView scrollView = new ScrollView(this); 
    scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    TableLayout tableLayoutMaster = new TableLayout(this); 
    tableLayoutMaster.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    // <table> 
    //  <tr><td><table><tr><td></td><td></td><td></td></tr></table></td></tr> 
    //  <tr><td></td></tr> 
    // </table> 

    for(int i=0; i<=30; i++) 
    { 
     TableLayout tableLayoutRow1 = new TableLayout(this); 
     tableLayoutRow1.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
     tableLayoutRow1.setColumnStretchable(2, true); 
     //tableLayoutRow1.setBackgroundColor(Color.GREEN); 
     TableRow tableRow = new TableRow(this); 

     ImageView left_column = new ImageView(this); 
     left_column.setImageResource(17301550); 
     tableRow.addView(left_column); 

     TextView middle_column = new TextView(this); 
     middle_column.setText("Left Column:" + Integer.toString(i)); 
     middle_column.setTypeface(null, Typeface.BOLD); 
     middle_column.setGravity(Gravity.LEFT); 
     middle_column.setPadding(5, 0, 0, 0); 
     tableRow.addView(middle_column); 

     TextView right_column = new TextView(this); 
     right_column.setText("Right Column:" + Integer.toString(i)); 
     right_column.setTypeface(null, Typeface.BOLD); 
     right_column.setGravity(Gravity.RIGHT); 
     right_column.setPadding(0, 0, 5, 0); 
     tableRow.addView(right_column); 

     tableLayoutRow1.addView(tableRow); 
     tableRow = null; 

     // now for the bottom row 
     TextView bottom_column = new TextView(this); 
     bottom_column.setText("Starting activity com.developersinfo.testing.TableActivity on device emulator-5554"); 
     bottom_column.setTextSize(12f); 
     bottom_column.setGravity(Gravity.LEFT); 
     bottom_column.setPadding(30, 0, 0, 0); 
     tableLayoutRow1.addView(bottom_column); 

     tableLayoutRow1.setId(i); 
     tableLayoutRow1.setOnFocusChangeListener(new OnFocusChangeListener() { 

      @Override 
      public void onFocusChange(View v, boolean hasFocus) { 
       // TODO Auto-generated method stub 
       Log.d("OnFocusChange", "OnFocusChange Event for " + Integer.toString(v.getId())); 
      } 
     }); 
     tableLayoutRow1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Log.d("OnClick", "OnClick Event for " + Integer.toString(v.getId())); 
      } 
     }); 
     tableLayoutRow1.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       Log.d("OnTouch", "OnTouch Event for " + Integer.toString(v.getId()) + " event:" + Integer.toString(event.getAction())); 

       switch(event.getAction()) 
       { 
        case MotionEvent.ACTION_DOWN: 
         Log.d("OnTouch", "Changing to GREEN"); 
         v.setBackgroundColor(Color.GRAY); 
         break; 
        case MotionEvent.ACTION_UP: 
        case MotionEvent.ACTION_MOVE: 
         Log.d("OnTouch", "Changing to BLACK"); 
         v.setBackgroundColor(Color.BLACK); 
         break; 
       } 

       return true; 
      } 
     }); 

     // now add to master table 
     tableLayoutMaster.addView(tableLayoutRow1); 
    } 

    scrollView.addView(tableLayoutMaster); 
    linearLayout.addView(scrollView); 
    setContentView(linearLayout); 
    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
} 

}

我已經試過所有我能想到的,以防止它這樣做,但到目前爲止,我無法解釋爲何或如何糾正它。只要我不調用onTouch中的setBackgroundColor,所有內容都會按照預期滾動並對齊。

回答

0

我在工作的項目中遇到了幾乎完全相同的問題。我花了很長時間試圖弄清楚什麼是錯誤的,但最終只有解決方案是把表格佈局排掉,然後去做別的事情。它看起來像系統中的一個bug。

如果可能,我推薦使用RelativeLayout。

0

我測試你的代碼在一個活動,我不認爲和看不到對齊是壞的,當觸摸錶行看起來不錯...(我的意思是onTouchEvent不會混亂佈局對齊 無論如何,我建議你一個ListActivity如果這樣做,你可以設置一個選擇器背景到內部視圖,以及一個顏色或繪製到任何狀態的視圖,選中,按下......等等......以及內部您可以使用相對佈局或其他佈局的內部視圖... 還有一件事,ListActivity使用非常高效的ListAdapters,視圖是虛擬化的,這意味着設備不必保持所有視圖,只有那些可見和不可見您實際持有的30 * 4個視圖。

0

感謝o你的洞察力。我會看看ListActivity和ListAdapters,但是這更像是一次理解考察,而不是現在的任何事情。按照Juhani的建議,我使用大錘方法工作。

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

    ScrollView scrollView = new ScrollView(this); 
    scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 

    LinearLayout layout_master = new LinearLayout(this); 
    layout_master.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); 
    layout_master.setOrientation(LinearLayout.VERTICAL); 

    scrollView.addView(layout_master); 

    for(int i=1; i<=30; i++) 
    { 
     RelativeLayout layout_body = new RelativeLayout(this); 

     TextView left_Column = new TextView(this); 
     left_Column.setId(i); 
     left_Column.setText("Left"); 
     left_Column.setGravity(Gravity.LEFT); 
     left_Column.setPadding(5, 0, 5, 0); 

     TextView middle_Column = new TextView(this); 
     RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     lp.addRule(RelativeLayout.RIGHT_OF, left_Column.getId()); 
     middle_Column.setLayoutParams(lp); 
     middle_Column.setText("Middle"); 
     middle_Column.setGravity(Gravity.LEFT); 
     middle_Column.setPadding(5, 0, 5, 0); 

     TextView right_Column = new TextView(this); 
     lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     right_Column.setLayoutParams(lp); 
     right_Column.setText("Right"); 
     right_Column.setGravity(Gravity.RIGHT); 
     right_Column.setPadding(5, 0, 5, 0); 

     layout_body.addView(left_Column); 
     layout_body.addView(middle_Column); 
     layout_body.addView(right_Column); 

     TextView bottom = new TextView(this); 
     bottom.setId(1000 + i); 
     lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     lp.addRule(RelativeLayout.BELOW, left_Column.getId()); 
     bottom.setLayoutParams(lp); 
     bottom.setText("Starting activity com.developersinfo.testing.TestLayout on device emulator-5554"); 
     layout_body.addView(bottom); 

     View view_hr = new View(this); 
     view_hr.setMinimumWidth(layout_body.getWidth()); 
     view_hr.setMinimumHeight(1); 
     view_hr.setBackgroundColor(Color.GRAY); 
     lp = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     lp.addRule(RelativeLayout.BELOW, bottom.getId()); 
     view_hr.setLayoutParams(lp); 
     layout_body.addView(view_hr); 

     layout_body.setOnTouchListener(new OnTouchListener() { 

      public boolean onTouch(View v, MotionEvent event) { 
       switch(event.getAction()) 
       { 
        case MotionEvent.ACTION_DOWN: 
         Log.d("OnTouch", "Changing to GREEN"); 
         v.setBackgroundColor(Color.GREEN); 
         break; 
        default: 
         Log.d("OnTouch", "Changing to BLACK"); 
         v.setBackgroundColor(Color.BLACK); 
         break; 
       } 
       return true; 
      } 
     }); 

     layout_master.addView(layout_body); 
    } 

    //scrollView.addView(layout_master); 
    setContentView(scrollView); 
} 

}