【问题标题】:LinearLayout.getWidth() not reflecting new width from setLayoutParamsLinearLayout.getWidth() 不反映来自 setLayoutParams 的新宽度
【发布时间】:2015-02-05 06:35:07
【问题描述】:

tl/dr

我正在尝试更改代码中的一些布局大小,我可以更改其中一些,但其他需要根据 更改不会一起更新。相反,它们保留以前的宽度 改变的人有。

所以,我在使用 Android Studio 并试图以编程方式更改某些 LinearLayouts 的大小。

这就是我正在做的:

final LinearLayout ll3 = (LinearLayout)findViewById(R.id.box3);
ViewGroup.LayoutParams p3 = ll3.getLayoutParams();
int w3 = 5;
float aux = (float)w3/15;
p3.width = Math.round(max*aux);
ll3.setLayoutParams(p3);

然后这就是我得到的:

Log.i("OnLongClick p3_width", Integer.toString(p3.width));
Log.i("OnLongClick ll3_getWidth", Integer.toString(ll3.getWidth()));

OnLongClick p3_width:179

OnLongClick ll3_getWidth﹕224

ll3.getWidth() 正在返回之前的值,即在设置新参数之前 ll3 HAD。 如果我重复这个过程,那么它将显示如下内容:

OnLongClick p3_width:314 //新值

OnLongClick ll3_getWidth﹕179 //旧(上一个)值

我需要 ll3.getWidth() 与 p3.width 相同,因为我在另一个函数中调用它以重新计算我的应用程序拥有的其他 LinearLayouts。否则,当应用重绘它时,手动更改的矩形会改变,但其他的(使用更改来修改自身)将保持之前更改的方式(对不起这句话)。

我认为发生这种情况是因为 setLayoutParams 必须及时完成它的工作,而不是在我调用 getWidth() 之前,但我不知道这是否真的是问题,以及如何解决它。

感谢任何帮助。

提前致谢!!!

EDIT2: 如果我发送

openOptionsMenu();
closeOptionsMenu();

它固定矩形的大小。但是,这样做会造成延迟,因此非常难看。 无论如何,我需要在 openOptionsMenu() 中间放置任何东西来解决这个问题(closeOptionsMenu() 不会改变视图,只会关闭菜单)。

【问题讨论】:

  • 可以看到xml吗?
  • 在设置 layoutParams 后尝试调用ll3.invalidate()
  • @TheRedFox <LinearLayout android:id="@+id/box3" android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:layout_marginRight="@dimen/separator" android:background="#8888ff" android:layout_marginBottom="@dimen/separator"/> 宽度是之前计算的(从重量开始),所以它实际上不是0
  • @tolgap 仍然没有更新 =(
  • R.id.box3 的父级是什么?

标签: android android-layout layoutparams


【解决方案1】:

找到答案了!!!就像很多时候一样,它就在我的脸上。

发生的事情是p3.width 只不过是ll3.getLayoutParams().width。 所以,我现在调用ll3.getLayoutParams().width,而不是调用ll3.getWidth()(返回错误的宽度),然后它会正确地进行计算。

我仍然不知道为什么ll3.getWidth() 会返回错误的值,但至少它可以正常工作(不过,如果您知道原因,也请告诉我!!!)。

【讨论】:

    【解决方案2】:

    第 1 步:通过 getLayoutParams() 获取 LinearLayout 的 LayoutParams。这些的实际类将取决于 LinearLayout 的父级。

    步骤 #2:修改 LayoutParams 中的值。

    第 3 步:通过 setLayoutParams() 设置 LinearLayout 修改后的 LayoutParams。

    【讨论】:

    • Step#1 是 ViewGroup.LayoutParams p3 = ll3.getLayoutParams();步骤#2 是 p3.width = Math.round(max*aux);步骤#3 是 ll3.setLayoutParams(p3);我已经在做所有事情了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2020-10-14
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多