错误的视图高度已动态添加到Android中的容器:重量,线性和约束布局

时间:2018-08-11 20:49:53

标签: android kotlin view android-layout-weight

简介

我正在将从API获得的数据添加到线性布局中,因此数据是动态的。这是一个用于加密货币的应用程序,因此对于下载的每个硬币,它都会在新版式中画一条新线,并最终动态添加。

容器:ConstraintLayout和内部LinearLayout

我使用ContraintLayout作为第一个容器。在其中,我设置了LinearContainer,其中将包含动态添加的视图。

<android.support.constraint.ConstraintLayout
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"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/coinMarketActivity"
android:background="#131A24"
tools:context="coinmarket.CoinMarket">

<include
    android:id="@+id/include"
    layout="@layout/top_bar"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<LinearLayout
    android:id="@+id/coinMarketCapTitleLinearLayout"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="8dp"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/include">

    <TextView
        android:id="@+id/coinMarketCapTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:text="COIN MARKET CAP"
        android:textColor="#F89D1E"
        android:textSize="24sp"
        android:textStyle="bold" />

    <LinearLayout
        android:id="@+id/coinMarketCapLine"
        android:layout_width="wrap_content"
        android:layout_height="2dp"
        android:layout_marginStart="15dp"
        android:layout_weight="1"
        android:background="@drawable/borders"
        android:orientation="horizontal" />

</LinearLayout>

<LinearLayout
    android:id="@+id/coinDataContainer"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:layout_marginBottom="16dp"
    android:layout_marginEnd="8dp"
    android:layout_marginStart="8dp"
    android:layout_marginTop="16dp"
    android:gravity="center_vertical"
    android:orientation="vertical"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/coinMarketCapTitleLinearLayout">
</LinearLayout>

</android.support.constraint.ConstraintLayout>

要添加动态视图的容器是android:id =“ @ + id / coinDataContainer”

动态视图

此视图是从布局文件夹中的xml放大的。然后,我将从API中获得的数据添加到上面的部分中,并将其添加到coinDataContainer中。由于它是大型XML布局,因此我只会复制根元素:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="center_vertical"
android:orientation="horizontal"
android:padding="6dp"
android:layout_weight="0.1">

如您所见,我使用的是android:layout_weight =“ 0.1”,以便在屏幕上以相同的高度添加所有视图,并在其中分配所有空间。我还设置了android:layout_height =“ 0dp”和android:layout_height =“ wrap_content”具有相同的结果

失败

只有动态添加的第一个子项才在屏幕上绘制。但是,如果我添加以下代码,并在添加所有子代后不时执行这些代码,则会得到它有10个子代,而不是1:

var children = _mDataRootView!!.childCount
Log.e("number of children", children.toString())
var firstchild = _mDataRootView!!.getChildAt(0)
Log.e("height of first child", firstchild.measuredHeight.toString())
Log.e("width of first child", firstchild.measuredWidth.toString())
_mDataRootView!!.invalidate() // called to try to redraw without success

这是打印的日志:

08-11 22:43:25.276 4575-4575/app.manu.test E/number of children: 10
08-11 22:43:25.277 4575-4575/app.manu.test E/height of first child: 1013
08-11 22:43:25.277 4575-4575/app.manu.test E/width of first child: 2504

这是它在屏幕上的绘制方式:

Only one coin is being drawn

有什么想法我做错了吗?

更多信息

如果我将膨胀后的内部布局的代码粘贴到容器中,次数不限,那么所有空间都将正确地分布在视图之间,并且它们的高度都相同

1 个答案:

答案 0 :(得分:0)

我修复了!!! 感谢@Epig,因为他给了我所需的线索。

这就是我放大子视图的方式:

val coin_martket_item_view = LayoutInflater.from(this).inflate(R.layout.coin_market_item, null)

然后我尝试获取布局参数,因为@Epig告诉我设置适当的LayoutParam属性。

val current_params = coin_martket_item_view.layoutParams

current_params始终返回null

然后我将inflate命令更改为

val coin_martket_item_view = LayoutInflater.from(this).inflate(R.layout.coin_market_item, _mDataRootView, false)

以这种方式提供将要膨胀的视图组。突然,layoutParams开始出现在current_params val中,它开始绘制10个硬币而不是1个硬币,因此问题得以解决。

再次感谢StackOverflow!