Android FrameLayout和TextView-为什么LayoutParams在setGravity()不起作用的地方起作用?

Android FrameLayout和TextView-为什么LayoutParams在setGravity()不起作用的地方起作用?,android,textview,layoutparams,Android,Textview,Layoutparams,我正在使用框架布局(按需)在屏幕上显示一些文本。我希望文本位于某个特定的位置,所以我认为setGravity()可以完成这项工作。。。但不,它似乎对文本的去向没有任何影响(其他对象,如ImageView,甚至没有这种方法) 那么首先,TextView.setGravity()到底用于什么(编辑:我现在明白多了,谢谢!但问题的以下部分仍然不清楚。) 其次,以这种方式更新FrameLayout的唯一方法似乎是使用所需的设置创建一个新的FrameLayout.LayoutParams对象,然后使用se

我正在使用框架布局(按需)在屏幕上显示一些文本。我希望文本位于某个特定的位置,所以我认为setGravity()可以完成这项工作。。。但不,它似乎对文本的去向没有任何影响(其他对象,如ImageView,甚至没有这种方法)

那么首先,TextView.setGravity()到底用于什么(编辑:我现在明白多了,谢谢!但问题的以下部分仍然不清楚。)

其次,以这种方式更新FrameLayout的唯一方法似乎是使用所需的设置创建一个新的FrameLayout.LayoutParams对象,然后使用setLayoutParams()方法应用它。(这似乎会自动更新视图,因此是否需要进行requestLayout()调用?)。。。比如说,没有像我现在这样创建一个新的LayoutParams对象

谢谢!下面是一段代码片段,显示了我如何设置这个FrameLayout和TextView,以供参考

    FrameLayout fl1 = new FrameLayout(this);
    FrameLayout.LayoutParams flp1 = new FrameLayout.LayoutParams(
        LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    fl1.setId(9001);
    fl1.setLayoutParams(flp1);
      .....
    tv1 = new TextView(this);
    FrameLayout.LayoutParams tvp1 = new FrameLayout.LayoutParams(
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT,
        (Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM));
    tv1.setId(9006);
    tv1.setLayoutParams(tvp1); // This works
    tv1.setBackgroundColor(Color.GRAY);
    tv1.setTextColor(Color.BLACK);
    tv1.setText("Dynamic layouts ftw!");
    tv1.setGravity(Gravity.CENTER); // This does NOT work
     .....
    fl1.addView(tv1);
tv1.setGravity(重心)

属于
TextView
文本的重力

如各国所述:

设置文字的水平对齐方式和垂直重力 当文本视图中有额外的空间时,将使用该选项 文本本身需要什么

1) view.setGravity表示如果是子视图,视图应如何定位。 对于textview,它指的是文本的位置。 在线性布局或视图组中,它引用其子视图

2) 我查过你的密码了。您已经在使用textview.setGravity方法。在这种情况下,不需要在FrameLayout.LayoutParams构造函数中指定重力参数

我注意到的另一件事是,您将文本视图的宽度和高度设置为换行内容,而换行内容只考虑文本的大小。因此,赋予重力没有任何意义,因为textview没有额外的区域将文本定位到中心。您需要将文本视图的宽度指定为fill\u parent。这会让你的重力属性起作用

顺便说一句,这是一篇非常好的文章。它解释了重力和布局重力属性

如果希望textview包装内容,则应将textview添加到线性布局,并将Gravity设置为线性布局

这应该给出你想要做的事情

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
FrameLayout fr = new FrameLayout(this);
fr.setLayoutParams(lp);
fr.setBackgroundColor(Color.RED);

LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(
        LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT);
LinearLayout l = new LinearLayout(this);
l.setLayoutParams(lp2);
l.setGravity(Gravity.CENTER);
l.setBackgroundColor(Color.BLUE);

ViewGroup.LayoutParams vp = new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,
        LayoutParams.WRAP_CONTENT);
TextView t = new TextView(this);
t.setLayoutParams(vp);
t.setText("Blessan Mathew");
t.setBackgroundColor(Color.CYAN);

l.addView(t);
fr.addView(l);

谢谢我认为这很好地总结了引力问题(我只是通过实验验证了它)。我的问题的第二部分仍然不清楚。你是说“tv1.setGravity(Gravity.CENTER);”这句话吗?即使没有LayoutParams(或与之不同),它也没有效果。而填充家长则更糟糕——你可以将整个屏幕作为一个巨大的文本框。但是是的,我看到setGravity会影响文本在框中的结束位置。关于问题的第二部分……问题是,我提出的方法只使用一个FrameLayout和一个TextView(本例需要另一个布局)就可以完成我想要的工作。在这一点上,我只是想知道:A)当我通过setParams更新LayoutParams来移动文本框时,我是否需要调用requestLayout()(似乎不需要它)和B)有没有比创建一个全新的LayoutParams并再次调用setParams更简单的方法来更新LayoutParams(似乎没有)你需要单独的帕拉索克,这也是我现在要做的。调用setLayoutParams()更新它们之后,requestLayout()是必需的,还是隐含的?顺便问一下,上面的(断开的)“重力”文章链接应该指向什么?