【问题标题】:How can I programatically modify a FrameLayout's layout_weight? [duplicate]如何以编程方式修改 FrameLayout 布局权重? [复制]
【发布时间】:2018-01-19 12:07:50
【问题描述】:

我正在尝试实现一个动态布局,其中有 2 个片段(1 个占据屏幕顶部 80%,另一个占据屏幕底部 20%),我希望能够动态隐藏底部片段并拉伸顶部片段以填满屏幕。

如果有另一种方法,我想知道,但目前我只知道一种方法。所以我有 2 个 FrameLayout,我正在尝试将顶部 FrameLayout(main_container)的 layout_weight 设置为 5。

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.jobby.jobbydriver.activity.main"
    android:id="@+id/activity_main"
    android:orientation="vertical"
    android:background="@color/ColorBG"
    android:weightSum="5"
    android:layout_height="match_parent"
    android:layout_width="match_parent" >
    <FrameLayout
        android:id="@+id/main_container"
        android:layout_weight="4"
        android:layout_height="0dp"
        android:layout_width="match_parent" />
    <FrameLayout
        android:id="@+id/second_container"
        android:layout_weight="1"
        android:layout_height="0dp"
        android:layout_width="match_parent" />
</LinearLayout>

我的代码,

FrameLayout frameLayout = findViewById(R.id.main_container);
FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) frameLayout.getLayoutParams();
params.weight = 5.0f; // "weight" is red, (Cannot resolve symbol 'weight')
frameLayout.setLayoutParams(params);

在倒数第二行,params.weight 显示为红色,因此 weight 在这里不是 params 的值。这适用于 LinearLayout,但不适用于 FrameLayout,所以我不确定我做错了什么。

【问题讨论】:

  • FrameLayoutLinearLayout 内,所以它有LinearLayout.LayoutParams,而不是FrameLayout.LayoutParams。您将在LinearLayout.LayoutParams 中找到weight 字段。
  • @MikeM.,您的评论几乎是一个答案,而且是一个正确的答案。您不想将其更改为答案吗?
  • @VladMatvienko 我实际上是想找一个副本,但我现在正忙着聊天。如果您愿意,请随时将其发布为答案。
  • @MikeM.,我会先检查是否有重复
  • 谢谢,成功了

标签: android android-studio layout android-framelayout


【解决方案1】:

当您尝试获取任何视图/视图组布局参数时,它将提供其父级的布局参数。

考虑到这一点,您将获得LenearLayout.LayoutParams 而不是FrameLayout.LayoutParams

那么,试试这个:

    FrameLayout frameLayout = findViewById(R.id.main_container);
    LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) frameLayout.getLayoutParams();
    params.weight = 5.0f;
    frameLayout.setLayoutParams(params);

注意:您已经设置 weightsum 5。所以,还要考虑更改其他视图权重。

【讨论】:

  • 很好,这种方式比重复帖子中的最佳答案要好得多,因为这种方式只需要我设置权重。我会考虑是改变另一个视图的可见性还是改变它的权重,或者两者兼而有之。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 2013-02-03
  • 1970-01-01
  • 2021-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多