바인딩 보기 - 포함된 레이아웃에 대한 바인딩을 가져오려면 어떻게 해야 합니까?
뷰 바인딩 작업을 하는 동안 문서화되지 않은 몇 가지 사례를 발견했습니다.
첫 번째: 포함된 뷰 레이아웃 부분에 대한 바인딩을 어떻게 얻습니까?기본 바인딩은 기본 레이아웃에 정의된 항목만 봅니다.
두 번째: 병합된 레이아웃 부품에 대한 바인딩을 얻으려면 어떻게 해야 합니까?다시 말하지만, 주 바인딩은 주 레이아웃의 항목만 볼 수 있습니까?
다음의 경우:
- 병합 노드가 아닌 일반 레이아웃에 포함, 포함된 부품에 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
//[...]
}
- 외부 레이아웃에 병합 블록과 함께 포함합니다.병합 블록이 보기가 아니므로 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
다음 단계를 따릅니다.
private val binding : FragmentBinding
타고viewBinding(FragmentBinding::bind)
"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
'programing' 카테고리의 다른 글
jQuery로 파일 입력 크기를 확인하는 방법은 무엇입니까? (0) | 2023.08.13 |
---|---|
VBA를 사용하여 Excel과 수직으로 병합된 셀의 시작 범위 및 종료 범위 가져오기 (0) | 2023.08.13 |
새 줄을 분할하는 방법 (0) | 2023.08.13 |
MySQL/MariaDB에서 임의 절차 코드 실행 (0) | 2023.08.13 |
"헤드-n-3"에 해당하는 PowerShell? (0) | 2023.08.13 |