【问题标题】:Android FrameLayout and TextView - why does LayoutParams work where setGravity() does not?Android FrameLayout 和 TextView - 为什么 LayoutParams 在 setGravity() 不工作的地方工作?
【发布时间】:2011-11-24 04:06:00
【问题描述】:

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

首先, TextView.setGravity() 究竟是做什么用的? (编辑:我现在明白了很多,谢谢!但问题的以下部分仍然不清楚。)

其次,以这种方式更新 FrameLayout 的唯一方法似乎是使用您想要的设置创建一个新的 FrameLayout.LayoutParams 对象,然后使用 setLayoutParams() 方法来应用它。 (这似乎会自动更新视图,所以是否需要 requestLayout() 调用?) 还有一种更简单/更直接的方法可以为 FrameLayout 实现这一点......比如说,无需创建新的 LayoutParams像我现在这样反对?

谢谢!作为参考,下面是一个(工作)代码 sn-p,显示了我如何设置这个 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);

【问题讨论】:

    标签: android textview layoutparams


    【解决方案1】:

    1) view.setGravity 表示如果是子视图,视图应该如何定位。 在 textview 的情况下,它指的是文本的定位。 在线性布局或视图组中,它指的是其子视图。

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

    我注意到的另一件事是,您为 textview 提供了宽度和高度作为换行内容,这只会占用文本的大小。因此,赋予重力没有任何意义,因为 textview 没有额外的区域来将文本定位到中心。您需要将 textview 的宽度指定为 fill_parent。这应该使您的重力属性起作用。

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

    如果您希望您的 textview 包装内容,那么您应该将您的 textview 添加到线性布局,并将 setgravity 添加到线性布局。

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

    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(或与它们不同),它也没有效果。并且 fill_parent 更糟糕 - 你将整个屏幕作为一个巨大的文本框。但是,是的,我看到 setGravity 会影响文本在该框中的最终位置。关于问题的第二部分......
    • 事情是,我想出的只是使用 FrameLayout 和 TextView(此示例需要另一种布局)。在这一点上,我只是想知道:A)当我通过 setParams 更新 LayoutParams 来移动文本框时,我是否需要调用 requestLayout() (似乎没有它)和 B)是否有比更新 LayoutParams 更简单的方法创建一个全新的 LayoutParams 并在其上再次调用 setParams(似乎没有)?
    • 你需要单独的参数
    • 好的,这也是我现在正在做的。调用 setLayoutParams() 更新它们后是否需要 requestLayout(),还是隐含的?
    • 而且,顺便说一下,上面那个(损坏的)“重力”文章链接应该指向this page吗?
    【解决方案2】:

    tv1.setGravity(Gravity.CENTER);

    属于TextView里面的TEXT的重力。

    正如documentation 所说:

    设置文本的水平对齐和垂直重力 当 TextView 中有额外空间时将使用 文本本身需要什么。

    【讨论】:

    • 谢谢!我认为这很好地总结了重力问题(我只是通过实验验证了它)。不过,我的问题的第二部分仍然不清楚。
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2012-06-27
    • 1970-01-01
    • 2012-04-26
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多