2

カスタム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);
4

3 に答える 3

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

これは役立つかもしれません

于 2011-02-16T14:20:39.797 に答える
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 のデフォルトは、NinePatchDrawable高さ 64 ピクセルのデフォルト ビットマップです。EditText がこの高さの場合、テキストは中央に配置されます。そうしないと、本来よりも上に近くなります。背景色を設定するColorDrawableと、固有の高さゼロを報告する が内部的に使用されるため、テキストの高さのみを使用し、TOP に垂直に揃えます。

この問題を修正する方法は、独自のDrawableサブクラスを作成し、それを EditText インスタンスの背景として設定し、レポートする高さがあるようにドローアブルを呼び出して、ドローアブルのメソッドをsetBounds()オーバーライドして高さをレポートすることです。getIntrinsicHeight()を使用して設定しsetBounds()ました。

于 2013-01-15T22:55:38.647 に答える