Tuesday, July 23, 2013

Android TextView get/setGravityの指定方法

TextViewの位置揃えに使うget/setGravityの記述方法でややはまった。

文字を左寄せにしようとしてsetGravity(Gravity.LEFT);とか書いた後にgetGravityすると最初に指定した値と全然違うものが帰ってくるのだ。色々原因を調べてみたのだが、どうやら、segGravityには水平、垂直方向両方の指定がなされる事を前提としているらしい。なのでsetGravityには水平、垂直方向両方の指定をするか、getGravity時にマスクをかけて任意の方向の値指定のみを取得する必要があるらしい


//Gravity.Leftのnumeric表現は3
textView.setGravity(Gravity.LEFT);
final int gravityValue = textView.getGravity();
//gravityValue に3を期待するが実際は51が帰ってくる

//正しくは以下のように水平、垂直方向両方の指定をする
textView.setGravity(Gravity.LEFT|Gravity.TOP);

//もしくはgetGravityした値に対して任意の方向のマスクをかけると垂直、水平方向のみの値が取得できる
final int horizontalGravityValue = textView.getGravity & Gravity.HORIZONTAL_GRAVITY_MASK; //水平方向の値指定のみ取得
final int verticalGravityValue = textView.getGravity & Gravity.VERTICAL_GRAVITY_MASK; //垂直方向の値指定のみ取得


TextView#L2816(バージョン4.2.2)
ソースを眺めたら、setGravityでは垂直方向の指定がなされていない場合はGravity.TOP, 水平方向の指定がなされていない場合はGravity.STARTを自動的に指定する模様。

No comments :

Post a Comment