programing

바인딩 보기 - 포함된 레이아웃에 대한 바인딩을 가져오려면 어떻게 해야 합니까?

css3 2023. 8. 13. 09:52

바인딩 보기 - 포함된 레이아웃에 대한 바인딩을 가져오려면 어떻게 해야 합니까?

뷰 바인딩 작업을 하는 동안 문서화되지 않은 몇 가지 사례를 발견했습니다.

첫 번째: 포함된 뷰 레이아웃 부분에 대한 바인딩을 어떻게 얻습니까?기본 바인딩은 기본 레이아웃에 정의된 항목만 봅니다.

두 번째: 병합된 레이아웃 부품에 대한 바인딩을 얻으려면 어떻게 해야 합니까?다시 말하지만, 주 바인딩은 주 레이아웃의 항목만 볼 수 있습니까?

다음의 경우:

  1. 병합 노드가 아닌 일반 레이아웃에 포함, 포함된 부품에 ID를 할당해야 합니다. 이렇게 바인딩하면 포함된 하위 부품에 액세스할 수 있습니다.
<include
    android:id="@+id/your_id"
    layout="@layout/some_layout" />

활동 코드에서 다음과 같이 입력합니다.

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    setContentView(exampleBinding.root)
    //we will be able to access included layouts view like this
    val includedView: View = exampleBinding.yourId.idOfIncludedView
//[...]
}
  1. 외부 레이아웃에 병합 블록과 함께 포함합니다.병합 블록이 보기가 아니므로 ID를 추가할 수 없습니다.이러한 영구 병합 레이아웃(merge_layout.xm)이 있다고 가정합니다.
<?xml version="1.0" encoding="utf-8"?>
<merge 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:showIn="@layout/activity_example">

    <TextView
        android:id="@+id/some_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World" />
</merge>

이러한 병합 레이아웃을 올바르게 바인딩하려면 다음 작업을 수행해야 합니다.

활동 코드:

private lateinit var exampleBinding: ActivityExampleBinding  //activity_example.xml layout
private lateinit var mergeBinding: MergeLayoutBinding  //merge_layout.xml layout

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    exampleBinding = ActivityExampleBinding.inflate(layoutInflater)
    //we need to bind the root layout with our binder for external layout
    mergeBinding = MergeLayoutBinding.bind(exampleBinding.root)
    setContentView(exampleBinding.root)
    //we will be able to access included in merge layout views like this
    val mergedView: View = mergeBinding.someView
//[...]
}

첫 번째 질문과 관련하여 포함된 레이아웃에 대한 뷰 바인딩을 얻을 수 있습니다.

여기 샘플이 있습니다.main_fragment.xml파일:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycler_view_main"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />

    <include
        android:id="@+id/toolbar"
        layout="@layout/toolbar" />

</LinearLayout>

그리고.MainFragment.java다음과 같을 수 있습니다.

public class MainFragment extends Fragment {

    private MainFragmentBinding binding;
    private ToolbarBinding toolbarBinding;

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

        binding = MainFragmentBinding.inflate(inflater, container, false);
        toolbarBinding = binding.toolbar;

        return binding.getRoot();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();

        toolbarBinding = null;
        binding = null;
    }
}

이제 두 가지 바인딩이 있습니다.하나는 기본 레이아웃에 해당하고 다른 하나는 포함된 레이아웃에 해당합니다.

포함된 레이아웃을 바인딩하려면,

활동용

YourMainLayoutBinding mainLayoutBinding = MainLayoutBinding.inflate(getLayoutInflater);

View view = mainLayoutBinding.getRoot();

YourIncludedLayoutBinding includedLayoutBinding = YourIncludedLayoutBinding.bind(View);

조각용

YourMainLayoutBinding mainLayoutBinding = MainLayoutBinding.inflate(inflater,container,false);

View view = mainLayoutBinding.getRoot();

YourIncludedLayoutBinding includedLayoutBinding = YourIncludedLayoutBinding.bind(View);

주 레이아웃 바인딩 상위 루트가 선형 레이아웃인 경우 포함된 레이아웃 바인딩 상위 레이아웃도 선형 레이아웃인지 확인합니다.

예를 들어 레이아웃을 포함했다고 가정해 보겠습니다.activity_main.xml파일은 다음과 같습니다.

<include
    android:id="@+id/ll_layout1"
    layout="@layout/layout1"
    android:visibility="gone" />

그리고 제가 가시성을 바꾸고 싶었다고 가정해 보겠습니다.다음과 같이 할 수 있습니다.

activityMainBinding.llLayout1.root.visibility = View.VISIBLE

나의 경우, 나는 할당하는 것을 잊었습니다.id에게include꼬리표를 달다

이제, 당신이 할당한 것은id다음과 같이 결합 대상을 얻을 수 있습니다.

YourMainLayoutBinding.YourIncludeTagIDLayoutBinding

다음 단계를 따릅니다.

  1. private val binding : FragmentBinding타고viewBinding(FragmentBinding::bind)

  2. "onViewCreated(보기: 보기, 저장된 인스턴스 상태: 번들?)"

     val binding2 = binding.root.include_layout_id
    

: val binding2 = binding.root.tool_bar_backets

이제 여기에서 포함 레이아웃, 보기에 액세스합니다.

binding2.textView.text = "your text"

fragment와 관련된 첫 번째 질문에 답하면, MainFragment의 xml 파일에 "error_layout"을 포함했다고 가정합니다.

<include
    layout="@layout/error_layout"
    android:id="@+id/layout_error"
    android:visibility="gone"/>

이제 "error_layout"에 ID가 "btn_try_again"인 버튼이 있습니다.이 단추에 대한 온클릭 수신기를 설정하려고 합니다.

이렇게 하면 fragment_main.xml 파일에 대한 바인딩 개체를 사용하여 "btn_try_again"에 대한 참조를 얻을 수 있습니다.

binding.layoutError.btnTryAgain

데이터 바인딩 라이브러리를 사용합니다. 다음 을 그런다 XML 이으묶습다로 묶습니다.<layout>꼬리표를 달다

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    ... 

    <include 
      android:id="@+id/toolbar"
      layout="@layout/toolbar" />
    
    ...

</LinearLayout>
</layout>

toolbar.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <ImageView 
        android:id="@+id/ivImage"
        ... />

    <TextView 
        android:id="@+id/tvTitle"
        ... />


</LinearLayout>

기본 활동.kt

private lateinit var binding: ActivityMainBinding  

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = DataBindingUtil.setContentView(this, R.layout.activity_main)

    // Access include layout views
    binding.toolbar.rootView.ivImage.setImageResource(R.drawable.ic_back_arrow)
    binding.toolbar.rootView.tvTitle.text = getString(R.string.home)
   
    ...
}

포함 레이아웃에서 컨테이너 레이아웃을 작성하고 여기에 ID를 입력해야 합니다.

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/example"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintTop_toTopOf="parent">
    </androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

언급URL : https://stackoverflow.com/questions/58730127/view-binding-how-do-i-get-a-binding-for-included-layouts