自定义EditText垂直对齐

时间:2011-02-16 14:17:51

标签: android android-edittext custom-view

我创建了一个自定义的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);

3 个答案:

答案 0 :(得分:2)

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

这可能会有所帮助

答案 1 :(得分:1)

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

向下调整字体大小,或者如果使用默认值,请指定字体大小,直到找到足够小的字体大小值才能使其正确居中。

答案 2 :(得分: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);

现在,OS源代码中的步骤跟踪显示垂直居中的计算奇怪地依赖于背景报告的高度。 EditText中的Defaut是NinePatchDrawable,具有64像素高的默认位图。如果您的EditText是此高度,则您的文本将居中。否则,它将比它应该更接近顶部。设置背景颜色将在内部使用ColorDrawable报告固有高度为零,因此仅使用文本高度并将其垂直对齐到TOP。

解决此问题的方法是创建自己的Drawable子类,将其设置为EditText实例的背景,确保在drawable上调用setBounds()因此它具有报告的高度,并覆盖drawable的getIntrinsicHeight()方法以报告使用setBounds()设置的高度。