Я вижу ту же проблему. Программное создание EditText привело к тому, что гравитация была вертикально переведена в ТОП (хотя горизонтальное центрирование все еще работает) ... пока я не закомментировал вызовы, которые устанавливают фон! В этом случае учитываются как вертикальная, так и горизонтальная гравитация.
Вот мой код:
inputField.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
inputField.setLinksClickable(false);
inputField.setInputType(ie.getInputType());
inputField.setFadingEdgeLength(0);
inputField.setHorizontalFadingEdgeEnabled(false);
inputField.setPadding(borderWidth.left,borderWidth.top,borderWidth.right,borderWidth.bottom);
inputField.setOnEditorActionListener(this);
inputField.setHint(hint);
inputField.setCompoundDrawables(null, null, null, null);
// comment out the next two lines to see gravity working fine
inputField.setBackgroundDrawable(null);
inputField.setBackgroundColor(Color.WHITE);
inputField.setTextColor(Color.BLACK);
inputField.setTextSize(TypedValue.COMPLEX_UNIT_PX, 20);
inputField.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
Теперь пошаговая трассировка в исходном коде ОС показывает, что вычисления для вертикального центрирования странным образом зависят от высоты, сообщаемой фоном. По умолчанию в EditText используется значение NinePatchDrawable
с растровым изображением по умолчанию, высотой 64 пикселя. Если ваш EditText имеет такую высоту, ваш текст будет центрирован. В противном случае он будет ближе к вершине, чем должен. При установке цвета фона внутри будет использоваться ColorDrawable
, который сообщает внутреннюю высоту нуля, поэтому используется только высота текста и выравнивание по вертикали по TOP.
Способ решения этой проблемы - создать собственный подкласс Drawable
, установить его в качестве фона экземпляра EditText, убедитесь, что вы вызываете setBounds()
для объекта рисования, чтобы он имел высоту сообщить и переопределить метод getIntrinsicHeight()
объекта drawable, чтобы сообщить о высоте, которая была установлена с помощью setBounds()
.