2010-11-24 4 views
1

Reformulation par demande précédente ... J'ajoute dynamiquement TableLayouts à l'exécution. Un aperçu de vue ressemble à ceci ... LinearLayout-> ScrollView-> TableLayout-> Boucle créant TableLayouts et TableRows à l'exécution. Donc, fondamentalement, je suis mise en boucle et en ajoutant ce qui suit:setBackgroundColor provoquant des problèmes d'alignement TableLayout

for (i = 0 .... i ++)

gauche                     Moyen                     Droite

Dessous

Maintenant tout est ajouté correctement, semble correct et défile correctement. Cependant j'essaye de créer un événement d'onTouch qui change l'arrière-plan sur le TableLayout créé dynamiquement touché. A l'intérieur du OnTouch pour chaque je TableLayout dynamiquement créé un événement OnTouch que lorsque appelé effectue les opérations suivantes:

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

Chaque fois qu'il appelle le setBackgroundColor il salit l'alignement de chacun des TableLayouts dynamiquement créés et les fait ressembler à ceci:

LeftMiddleRight

Bas

Le code entier suit. J'espère que c'est clair maintenant.

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

}

J'ai tout essayé, je peux penser à l'empêcher de le faire, mais je suis jusqu'à présent incapable d'expliquer pourquoi ou comment le corriger. Tant que je n'appelle pas setBackgroundColor à l'intérieur du onTouch tout défile et s'aligne comme prévu.

Répondre

0

J'avais à peu près exactement le même problème que vous avez dans un projet que j'ai travaillé. J'ai longtemps essayé de comprendre ce qui ne va pas, mais à la fin, la seule solution était d'abandonner la disposition de la table et d'aller chercher autre chose. Cela ressemble à un bug dans le système pour moi.

Je recommande d'utiliser RelativeLayout à la place si possible.

0

je teste votre code dans une activité, et je ne pense pas et ne vois pas l'alignement est mauvais, en touchant la ligne du tableau il semble bon ... (je veux dire le onTouchEvent ne gâche pas l'aligment de mise en page Quoi qu'il en soit, je vous suggère une ListActivity si vous le faites, vous pouvez définir un fond de sélecteur pour les vues internes, et une couleur ou dessinable à n'importe quel état de la vue, sélectionné, pressé ... et plus ... vous pouvez utiliser une disposition relative ou une autre disposition ... Il y a une autre chose, ListActivity utilise ListAdapters qui sont très efficaces, les vues sont virtualisées c'est-à-dire que l'appareil n'a pas besoin de contenir toutes les vues, seulement celles qui sont visibles les vues 30 * 4 que vous détenez actuellement

0

Merci à la fois o f vous pour la perspicacité. Je vais regarder le ListActivity et ListAdapters mais c'était plus d'une expédition de compréhension que quoi que ce soit à ce stade. J'ai ce travail en utilisant l'approche sledgehammer comme suggéré par 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); 
} 

}

Questions connexes