2016-06-04 22 views
2

Ich erstelle eine TableLayout programmgesteuert. Eine Tabellenzeile kann aus einer Menge + Einheit (Zelle 1) und einem Inhaltsstoff (Zelle 2) und einer Lösch-Schaltfläche (Zelle 3) bestehen. Die Zutaten können länger als die zur Verfügung stehende Breite sein, so habe ich das Gewicht Attribut und setze es auf 1 einen Zeilenumbruch zu aktivieren:Android: Höhe der Tabellenzelle sollte Höhe der vorherigen Zelle

setLayoutParams(new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, 1f)); 

Dies funktioniert. Das Problem ist, dass die Schaltfläche Löschen verhindert, dass die Tabellenzeile die Höhe zu erhöhen, so dass es teilweise verborgen ist, die wie folgt aussieht:

hidden row

Dies ist der wichtigste Teil des Codes, der eine Tabellenzeile erzeugt:

final TableRow tableRow = new TableRow(getApplicationContext()); 
tableRow.setTag(INGREDIENT_ENTRY); 
tableRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT)); 

// Amount and unit 
int dp6InPixel = PixelCalculator.convertDpToPixel(getApplicationContext(), 6); 
TextView tvAmountAndUnitText = new TextView(getApplicationContext()); 
tvAmountAndUnitText.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT)); 
tvAmountAndUnitText.setText(strAmount + " " + strUnit); 
tvAmountAndUnitText.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.black)); 
tvAmountAndUnitText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f); 
tvAmountAndUnitText.setGravity(Gravity.RIGHT); 
tvAmountAndUnitText.setTypeface(tvAmountAndUnitText.getTypeface(), Typeface.BOLD); 
tvAmountAndUnitText.setPadding(dp6InPixel, 0, dp6InPixel, 0); 
tableRow.addView(tvAmountAndUnitText); 

// Ingredient 
TextView tvIngredientText = new TextView(getApplicationContext()); 
tvIngredientText.setLayoutParams(new TableRow.LayoutParams(0, TableRow.LayoutParams.WRAP_CONTENT, 1f)); 
tvIngredientText.setText(strIngredient); 
tvIngredientText.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.black)); 
tvIngredientText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16f); 
tableRow.addView(tvIngredientText); 

// Button 
int dp10InPixel = PixelCalculator.convertDpToPixel(getApplicationContext(), 10); 
TextView tvIngredientDeleteButton = new TextView(getApplicationContext()); 
LayoutParams buttonParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.WRAP_CONTENT); 
buttonParams.setMargins(dp10InPixel, 0, 0, 0); 
tvIngredientDeleteButton.setLayoutParams(buttonParams); 
tvIngredientDeleteButton.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.black)); 
tvIngredientDeleteButton.setBackgroundColor(ContextCompat.getColor(getApplicationContext(), R.color.lightred)); 
tvIngredientDeleteButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20f); 
tvIngredientDeleteButton.setPadding(dp6InPixel, dp6InPixel, dp6InPixel, dp6InPixel); 
tvIngredientDeleteButton.setText("x"); 
//more code 

tableRow.addView(tvIngredientDeleteButton); 
ingredientTable.addView(tableRow); 

Wenn ich tvIngredientDeleteButton.setMinLines(2); gesetzt, dann kann ich die volle Zutat Zelle sehen. Leider haben alle Zeilen eine Mindesthöhe von 2, was hässlich aussieht. Ich brauche einen Weg, um zu erkennen, ob die Inhaltsstoffzelle einen Zeilenumbruch hat, und setze minLines für diesen Fall oder irgendeine andere gute Lösung (aber ich zähle keine Zutatenzeichen oder etwas. Ich denke, das kann mit einigen Tabellenattributen oder Ähnlichem gelöst werden). Irgendwelche Ideen, wie man dieses Problem löst?

Antwort

1

TableRow ist die direkte Unterklasse von LinearLayout. Um festzulegen, wie Kinderansichten darin positioniert werden, müssen Sie die Schwerkraft definieren. Der Standardwert ist TOP, und ich habe es mit FILL, CENTER_VERTICAL usw. versucht. Daher wird jeder Wert von setGravity() außer TOP TextView mit vollem Inhalt darstellen. Bitte beziehen Sie sich auf offizielle document, für weitere Details.

Sie müssen also nur eine Aussage zur Zeit der Deklaration von TableRow hinzufügen, um Ihre Anforderung zu erfüllen.

  tableRow.setGravity(Gravity.FILL);