我注意到,具有相同textSize的TextView可能会根据其显示的字符串而具有不同的高度。
当我支付一个简单的TableLayout时,我发现它有一些TableRow项和一些单元格,每个单元格都是一个TextView。
这些单元格没有上边距,它们在Android 8.0和更高版本的设备中绘制得很完美,但在Android 7.0和更低版本中,一些单元格在它们之间添加了上边距,这是因为TextView的高度不同我不明白这是怎么回事,真令人沮丧。
在这种情况下,它发生在名为player
的TextView中,并且只有当名称太长并且使用省略号来截断它时
代码很简单:
public void populateGoalscorersTable(ArrayList<Player> players){
goalscorersTableLayout.removeAllViews();
for (int i=0; i<players.size() && i<30; i++){
TableRow row = new TableRow(this);
row.setLayoutParams(goalscorersRowParams);
TextView position = new TextView(this);
position.setGravity(Gravity.CENTER);
position.setLayoutParams(goalscorersPositionParams);
position.setText(""+(i+1));
position.setBackgroundResource(R.drawable.table_cell_background);
position.setMinHeight((int) getResources().getDimension(R.dimen.cell_height));
row.addView(position);
TextView player = new TextView(this);
player.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
player.setLayoutParams(goalscorersPlayerParams);
player.setText(players.get(i).getName());
player.setBackgroundResource(R.drawable.table_cell_background);
player.setMaxLines(1);
player.setEllipsize(TextUtils.TruncateAt.END);
player.setPadding((int) getResources().getDimension(R.dimen.spacing_small),0,(int) getResources().getDimension(R.dimen.spacing_small),0);
player.setMinHeight((int) getResources().getDimension(R.dimen.cell_height));
row.addView(player);
TextView team = new TextView(this);
team.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);
team.setLayoutParams(goalscorersTeamParams);
team.setText(players.get(i).getTeam().getName());
team.setBackgroundResource(R.drawable.table_cell_background);
team.setMaxLines(1);
team.setEllipsize(TextUtils.TruncateAt.END);
team.setPadding((int) getResources().getDimension(R.dimen.spacing_small),0, (int) getResources().getDimension(R.dimen.spacing_small),0);
team.setMinHeight((int) getResources().getDimension(R.dimen.cell_height));
row.addView(team);
TextView goals = new TextView(this);
goals.setGravity(Gravity.CENTER);
goals.setLayoutParams(goalscorersPositionParams);
goals.setText(""+players.get(i).getLeagueGoals());
goals.setBackgroundResource(R.drawable.table_cell_background);
goals.setMinHeight((int) getResources().getDimension(R.dimen.cell_height));
row.addView(goals);
if (players.get(i).getTeam() == Manager.getInstance().getTeam()){
player.setTextColor(getResources().getColor(R.color.player_team));
player.setTypeface(null, Typeface.BOLD);
team.setTextColor(getResources().getColor(R.color.player_team));
team.setTypeface(null, Typeface.BOLD);
}
goalscorersTableLayout.addView(row);
}
}
这并不是使这个错误的上边距出现的唯一方法(由不正确的文本高度引起(,例如,当我有一行TextView单元格只有一个字符,而其他单元格有多个字符时,我可以看到它。字符数越多的TextViews就是边距。此外,当一些TextView向左对齐,而另一些居中时,我可以看到这种错误发生。非常令人沮丧。
如何避免这种情况?
如果字体不是等宽的,不同的文本可能有不同的大小,并且需要不同的空间来容纳字母,如j、p或q。