2017-09-28 5 views
0

데이터 바인딩을 사용하여 하위 뷰의 너비를 설정하는 방법. 설정할 값은 동적이며 부모 레이아웃의 너비에 따라 다릅니다.android 데이터 바인딩 parent_width에서 layout_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 %이면 텍스트 레이아웃의 너비가 상위 레이아웃의 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

당신은

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

그런 다음 XML에 bindWidth 방법을 사용하는 클래스 파일을 생성 예를 들어 MyBingding.class 수 있습니다

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

가 usedBarWidthPercentage의 데이터 타입이 bindWidth 방법의 퍼크와 동일해야합니다.

+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

이 iori24에 실망 할까봐 걱정됩니다. Qhite를 사용하여이 작업을 수행하는 방법을 알아 냈지만 일부 변수는 게시 이후에 수행 할 수 있으며 일부는 미리 수행해야합니다. 바인딩은 포스트 그리기 유형의 값을위한 것입니다. layout_width 및 layout_height는 미리 설정해야하는 사전 그리기 값입니다.

불행히도이를 수행 할 현재 방법이 없습니다. 나는 그것에 많은 기사를 발견 하고이 진술을 확인할 수 있습니다. 그러나 필자는 여러 가지 일치하는 부모 또는 가중치로 UI를 조작하여 필자가 필요로하거나 코드를 조정할 수있는 방법을 찾아 냈습니다.

layout_width 및 height에 데이터 바인딩을 가져 오면 결국 좋겠지 만, 이제는 디자인에 좀 더 창의적으로 접근해야합니다.

수정할 수있는 전체 샘플 코드를 제공하고 잠재적 수정본을 제공하려면 여기를 클릭하십시오. XML 옵션이 아닌 코드 옵션이 필요합니다. 이제 namezhouyu는 바인딩 어댑터 옵션을 게시했습니다. 이것은 텍스트 뷰를 취하고 그려진 후에 값을 수정할 수있는 포스트 드로입니다. 이 작업은 가능하지만 원본 크기가 wrap_content가 될 때 이상한 동작이 나타날 수 있으며 이후의 변경으로 인해 올바른 크기로 이동하게됩니다. 그러나 나는 그의 일을 좋아한다. 그것은 영리한 해결책이다.

그래서 바인딩을 통해 바인딩을 결정하면 namez houyu의 옵션을 따릅니다.