簡體   English   中英

Android數據綁定從父級寬度設置layout_width

[英]android data binding set layout_width from parent width

如何使用數據綁定設置子視圖的寬度。 要設置的值是動態的,並且取決於父布局的寬度。

item_bar.xml

<LinearLayout
    android:id="@+id/barLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:layout_width="@{model.usedBarWidthPercentage}"
        android:layout_height="4dp"/>
</LinearLayout>

該模型可以給我一個百分比。 例如,如果百分比為40%,則表示textview的寬度應為父版面的40%。

我知道使用數據綁定適配器的想法,但不知道如何使用父布局的寬度來做到這一點。

您可以創建一個類文件,例如MyBingding.class

@BindingAdapter({ "bindWidth" })
public static void bindWidth(TextView textView, double perc) {
    //You can do something by java code here 
    textView.xxxxxxxx; 
}

然后在XML中使用bindWidth方法:

<TextView
    app:bindWidth="@{model.usedBarWidthPercentage}"
    android:layout_width="wrap_content"
    android:layout_height="4dp"/>

確保usedBarWidthPercentage的數據類型與bindWidth方法的perc相同。

恐怕您會對這個iori24感到失望。 我嘗試了一段時間,以弄清楚如何完成此操作,但是某些變量可以在繪制后完成,而某些變量必須在繪制前完成。 綁定旨在用於值的繪制后類型。 layout_width和layout_height是需要預先設置的繪制前值。

不幸的是,目前尚無此方法。 我發現了很多文章,可以證實這一說法。 但是,我設法找到了使用各種匹配的父項或權重來操作UI的方法,以完成我需要的內容或在代碼中進行調整。

如果它們將數據綁定帶到layout_width和height上,我會很樂意,我認為它們最終會成功,但是就目前而言,您將只需要對您的設計更具創意。

如果您希望提供完整的示例代碼供某人進行修改並提供潛在的修復程序,但我想您這里將需要一個代碼選項,而不是一個XML選項。 現在namezhouyu發布了綁定適配器選項。 這是一個后繪制,將使用textview並在繪制后可能修改其值。 這可能會起作用,但是您可能會看到奇怪的行為,因為原始大小將為wrap_content,然后每個后續更改都將導致其跳轉為正確的大小。 但是我確實喜歡他的工作,這是一個聰明的解決方案。

因此,如果您受約束並決心通過綁定來做到這一點,那么我將遵循namez houyu的選擇。

我最終要做的是遵循@Raghunandan的建議

class ViewHolder(val binding: ItemViewBinding) : RecyclerView.ViewHolder(binding.root) {

    fun bind(model: Model) {
        Logger.d("START")
        binding.model = model

        val treeObserver = binding.viewLayout.viewTreeObserver
        if (treeObserver.isAlive) {
            treeObserver.addOnGlobalLayoutListener(object : OnGlobalLayoutListener {
                override fun onGlobalLayout() {
                    binding.viewLayout.viewTreeObserver.removeOnGlobalLayoutListener(this) // need to call viewTreeObserver again
                    val maxValue = binding.viewLayout.width
                    val usePerc = binding.model.getUsedBarWidthPercentage()
                    Logger.d("maxValue=$maxValue, usePerc=$usePerc")
                    binding.view.layoutParams.width = (maxValue * usePerc).toInt()
                }
            })
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM