将TextView的宽度设置为无效。

5

我想在代码中将我的文本视图的宽度设置为width = 119

tv.setWidth(width);
int width2 = tv.getWidth();

但我得到了结果。
width2 =12 

我在onlayout方法中有这段代码,当安卓系统再次调用onlayout(我认为是当文本视图实际上显示在屏幕上时)的时候,结果将是正确的。

width2 =119 

我认为如果宽度被设置为固定值,您可以在其绘制到UI之前再次将其设置为另一个值。

我如何知道onlayout何时被调用,因为有时在TextView实际上显示在屏幕上后它不会再次被调用?


我认为你的视图有一个父级,它限制了它的大小。 - Festus Tamakloe
为什么你想要设置一个宽度而不是使用布局文件自动定位和设置大小呢? - Squonk
你尝试过这样写吗?tv.getLayoutParams().height = 119; - ρяσѕρєя K
因为我想根据屏幕宽度计算宽度。 - Mohammed Subhi Sheikh Quroush
我已经回答过类似的问题。这个链接可能会有所帮助:https://dev59.com/PGnWa4cB1Zd3GeqPz2CK#26233453 - Radu Simionescu
4个回答

7

您需要尝试使用LayoutParams选项设置宽度,例如:

TextView tv = new TextView(getContext());
LayoutParams params = new LayoutParams(119,LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(params);

注意:我正在onFinishInflate方法中创建TextView tv = new TextView(getContext()); 并在onLayout方法中设置参数。 - Mohammed Subhi Sheikh Quroush
1
为什么存在 setWidth ?! - Nikola Lukic

4
LayoutParams param = txtv.getLayoutParams();
param.width = 45;
txtv.setLayoutParams(param);

1
LinearLayout.LayoutParams Params1 = new LinearLayout.LayoutParams(15,50);
tv.setLayoutParams(Params1);  

也许解释为什么这可能是答案可以帮助提问者。 - рüффп
1
TextView.setWidth 调用 requestLayout() 和 invalidate()。在某些情况下,例如当父布局的尺寸尚未确定或依赖于要添加的子项时,这会将宽度重置为零。 - mido

0

所有 UI 操作,如 setHeight、setLayoutParams、setText 等,都不会阻塞,直到屏幕上的所有内容都被渲染出来。因此,当您调用 setHeight 时,它将立即返回到您的代码,同时在下一个渲染周期中放置某种通知以更改 UI。

因此,当您执行 getHeight 时,UI 尚未重新渲染,因此仍然给出元素的旧高度。

您可以通过使用 view.post() 将您的 getHeight 代码延迟到下一次 UI 准备好进行新的渲染时。由于 setHeight 是在 view.post() 之前完成的,因此 view.post() 只会在 setHeight 渲染后运行:

tv.setWidth(width);
tv.post(new Runnable() {
    @Override
    public void run() //code here is only executed after setWidth has been rendered
    {
        Log.d(TAG," tv has been set to height="+ tv.getWidth();
    }
});

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