如何在Android中通过Java设置TextView的android:gravity属性

253

我可以在XML中使用android:gravity="bottom|center_horizontal"来对一个TextView进行布局,以达到想要的效果,但是我需要以编程的方式实现。我的TextView位于一个TableRow内,如果这对一个RelativeLayout有影响的话。

我尝试过:

LayoutParams layoutParams = new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
labelTV.setLayoutParams(layoutParams);

但是如果我理解正确的话,那将会应用于 tablerow 而不是 textview 是吗?

7个回答

594
labelTV.setGravity(Gravity.CENTER | Gravity.BOTTOM);

Kotlin版本(感谢Thommy)

labelTV.gravity = Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM

另外,您是在谈论重力还是layout_gravity?后者在RelativeLayout中不起作用。


谢谢,那个解决了。现在我感觉有点傻,居然没注意到那个。原问题是在文本字段上设置边距。我猜我假定没有setMargin()方法,也就想不到setGravity会存在。 - Nate
7
谢谢 +1,我找到了文档,但像往常一样只讲到了一半,没有明确说明我从哪里获取重力常数(如Gravity.CENTER等)。 - Hein du Plessis
4
对于像我这样从谷歌过来的人,Kotlin 的方式是:it.gravity = Gravity.CENTER_HORIZONTAL or Gravity.BOTTOM - Thommy
对我来说,Kotlin 的方式令人困惑,为什么是 or 而不是 and?!?! - ZooMagic
2
@ZooMagic 这不是一个 逻辑 运算符 (||),而是一个 位运算 运算符 (|)。位或运算将两个值的位进行比较,如果在相同位置上有一个(或两个)位为1,则输出1。例如:0010 | 1000 = 10101010 | 0101 = 11111100 | 1101 = 1101 - Sven van Zoelen

40

这将使文本视图中的文本居中:

TextView ta = (TextView) findViewById(R.layout.text_view);
LayoutParams lp = new LayoutParams();
lp.gravity = Gravity.CENTER_HORIZONTAL;
ta.setLayoutParams(lp);

5
没成功。“lp.gravity 无法解析或不是一个字段”。 - Nate
这很奇怪,因为这段代码在我的电脑上可以正常工作和编译。既然没有setWeight()方法,你会如何设置TextView的权重? - radiofrequency
4
我找到了问题所在。Nate引入了android.view.ViewGroup,但是该类有各种不同的方法,并且无法编译。你应该引入android.view.WindowManager。 - Finnboy11
当文本视图位于线性布局内时,最好导入android.widget.LinearLayout.LayoutParams。否则会出现ClassCastException。 - tomm
谢谢,它可以工作。但这不是一个完整的解决方案,因为这里没有定义一种LayoutParams类型,而且可能会有所不同,所以它无法编译。你应该知道一个父布局(例如LinearLayout)并在这里写出来。 - CoolMind

10
我们可以像下面这样在任何视图上设置布局重力 -
myView = findViewById(R.id.myView);
myView.setGravity(Gravity.CENTER_VERTICAL|Gravity.RIGHT);
 or
myView.setGravity(Gravity.BOTTOM);

这相当于下面的 XML 代码:

<...
 android:gravity="center_vertical|right"
 ...
 .../>

2
布局重力不同于重力。 - Zvonimir Peran

3
你应该使用textView.setGravity(Gravity.CENTER_HORIZONTAL);
记住,使用

标签来结束一个段落是不必要的。
LinearLayout.LayoutParams layoutParams =new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
layoutParams2.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;

这样做不会起作用。这将为部件设置重力,而不是为其文本设置重力。


2
请使用以下代码。
        TextView textView = new TextView(YourActivity.this);
        textView.setGravity(Gravity.CENTER | Gravity.TOP);
        textView.setText("some text");

2
textView.setGravity(Gravity.CENTER | Gravity.BOTTOM);

这将设置你的文本视图的重力。

1
通过以下几个步骤解决了这个问题,首先获取我的 TextViewheight,然后将其除以文本的 size,以获取 TextView 可能的总行数。
int maxLines = (int) TextView.getHeight() / (int) TextView.getTextSize();

获取这个值后,您需要将您的TextViewmaxLines设置为这个新值。
TextView.setMaxLines(maxLines);

当超过最大行数时,将Gravity设置为Bottom,它会自动向下滚动。

if (TextView.getLineCount() >= maxLines) {
    TextView.setGravity(Gravity.BOTTOM);
}

为了使其正常工作,您必须使用append()将文本添加到TextView中,如果使用setText()则无法正常工作。
TextView.append("Your Text");

这种方法的好处在于,无论您的TextViewheight和文本size如何,它都可以动态使用。如果您决定对布局进行修改,此代码仍将起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接