2

我创建了一个自定义 EditText(实际上,我只是设置了一个背景可绘制对象)。问题是它的文本总是顶部对齐的,我希望它垂直居中对齐。我已经尝试将其重力设置为 CENTER_VERTICAL,但它不起作用。这是我创建的drawable:

<?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);
4

3 回答 3

2
searchEditText.setGravity(Gravity.CENTER | Gravity.LEFT); 

这可能会有所帮助

于 2011-02-16T14:20:39.797 回答
1

尝试减小字体大小。无论出于何种原因,我发现如果您的字体太大,即使在您看来 EditText 应该足够高以容纳文本,文本也会看起来比垂直居中的要高。

向下调整字体大小,或者在使用默认值时指定字体大小,直到找到足够小的字体大小值以使其正确居中。

于 2014-06-30T21:53:07.423 回答
0

我看到了同样的问题。以编程方式创建 EditText 导致重力被垂直强制为 TOP(而水平居中仍然有效)......直到我注释掉设置背景的调用!在这种情况下,垂直和水平重力都受到尊重。

这是我的代码:

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 是这个高度,您的文本将居中。否则,它将比应有的更接近顶部。设置背景颜色将在内部使用 aColorDrawable报告固有高度为零,因此仅使用文本高度并将其垂直对齐到 TOP。

解决此问题的方法是创建您自己的Drawable子类,将其设置为 EditText 实例的背景,确保调用setBounds()可绘制对象以使其具有要报告的高度,并覆盖getIntrinsicHeight()可绘制对象的方法以报告高度使用setBounds().

于 2013-01-15T22:55:38.647 回答