2017-09-28 5 views
0

データバインディングを使用して子ビューの幅を設定する方法。設定する値は動的で、親レイアウトの幅に依存します。androidデータバインディングparent_widthからlayout_widthを設定

<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> 

item_bar.xmlモデルは私にパーセンテージを与えることができます。例えば、パーセンテージが40%の場合、テキストレイアウトの幅は親レイアウトの40%にする必要があります。

私はデータバインディングアダプターを使用するアイデアは知っていますが、親レイアウトの幅でどのようにそれを行うのか分かりません。

答えて

0

私は何をやって終わることは私の質問で述べたように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() 
       } 
      }) 
     } 
    } 
} 
1

あなたはクラスファイルを作成することができ、例えば、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と同じであることを確認してください。

+0

@従っている、私は結合アダプタを使用する方法を知っています。しかし、私は親のレイアウトの幅を渡す方法を知らない。 – iori24

+0

@ iori24あなたは 'Final ViewTreeObserver vto = binding.cd.getViewTreeObserver();)を使うことができます。 vto.addOnGlobalLayoutListener(新しいViewTreeObserver.OnGlobalLayoutListener(){ @Override公共ボイドonGlobalLayout(){ binding.cd.getViewTreeObserver()removeOnGlobalLayoutListener(この); INT幅= binding.cd.getMeasuredWidth(); INT height = binding.cd.getMeasuredHeight(); モデル。setMeasure(width); } }); ' – Raghunandan

+0

@Raghunandan thanks bro – iori24

1

あなたはこの1つのiori24に失望しますか?私はqhiteのためにこれを達成する方法を理解するために試しましたが、いくつかの変数はポストドローで行うことができ、いくつかは事前に行う必要があります。バインドは、ポストドロータイプの値を対象としています。 layout_widthおよびlayout_heightは事前に設定する必要のある事前描画値です。

残念ながら、これを行う方法は現在ありません。私はそれに関する多くの記事を見つけ、この声明を確認することができます。しかし、さまざまなマッチ・ペアレントやウェイトを使ってUIを操作して、必要なものを達成したり、コードを調整したりする方法を見つけました。

データがlayout_widthとheightにバインドされていれば、私は大好きですが、結局のところそうだと思いますが、今のところデザインをより創造的にする必要があります。

誰かが修正する可能性のある完全なサンプルコードを提供したい場合は、XMLオプションではなくコードオプションが必要になると思います。今、namezhouuuはバインディングアダプターオプションを掲示しました。これは、テキストビューを取得し、描画された後にその値を変更するポストドローです。これはうまくいくかもしれませんが、元のサイズがwrap_contentになると変わった動作が起こり、その後の変更によって正しいサイズにジャンプします。しかし私は彼の作品が好きです。それは巧妙な解決策です。

あなたがバインドされてバインドされていると判断された場合、namez houyuのオプションに従います。

関連する問題