Пользовательский EditText вертикальное выравнивание - PullRequest
2 голосов
/ 16 февраля 2011

Я создал собственный EditText (на самом деле, я просто установил фон для рисования).Проблема в том, что его текст всегда выровнен по верху, и я хочу, чтобы он был выровнен по вертикали по центру.Я уже пытался установить его гравитацию CENTER_VERTICAL, но это не работает.Это нарисованный мной чертеж:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="rectangle" android:gravity="center_vertical">
 <solid android:color="#FFFFFF"/>
 <stroke android:width="1dp" android:color="#88BA52" />  
 <corners
     android:bottomRightRadius="10dp"
     android:bottomLeftRadius="10dp"
     android:topLeftRadius="10dp"
     android:topRightRadius="10dp"/>
</shape>

И вот как я его создаю:

searchEditText = new EditText(getContext());
searchEditText.setTextSize(12);
searchEditText.setSingleLine();
searchEditText.setGravity(Gravity.CENTER_VERTICAL);
searchEditText.setHint(R.string.search_hint);
searchEditText.setBackgroundDrawable(
        getResources().getDrawable(R.drawable.search_field));
addView(searchEditText);

Ответы [ 3 ]

2 голосов
/ 16 февраля 2011
searchEditText.setGravity(Gravity.CENTER | Gravity.LEFT); 

Это может помочь

1 голос
/ 01 июля 2014

Попробуйте уменьшить размер шрифта.По каким-то причинам я обнаружил, что если размер шрифта слишком велик, даже если вам кажется, что текст EditText должен быть достаточно высоким, чтобы вместить текст, текст будет казаться выше, чем по центру по вертикали.

Уменьшите размер шрифта или укажите размер шрифта, если вы используете значение по умолчанию, пока не найдете достаточно маленький размер шрифта, чтобы он отображался по центру.

0 голосов
/ 16 января 2013

Я вижу ту же проблему. Программное создание 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().

...