视图绑定-我如何获得包含布局的绑定?

在使用视图绑定时,我遇到了一些未记录的情况。

第一:我如何获得绑定包含视图布局部分?主绑定只能看到在主布局中定义的项。

第二:如何获得合并布局部分的绑定。同样,主绑定只看到主布局中的项目?

63443 次浏览

在下列情况下:

  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
//[...]
}
    在外部布局中包含合并块。我们不能添加ID,因为merge block不是视图。 假设我们有这样的永恒合并布局(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;
}
}

现在您有了两个绑定:一个对应于主布局,另一个对应于包含的布局。

在包含布局中,你必须创建一个容器布局,并在这里放置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>

如果你想绑定包含布局,

活动

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);
确保你的主布局绑定父根是线性布局,然后, incldedlayoutbinding父布局也是线性布局

假设我在activity_main.xml文件中包含了一个布局,如下所示:

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

假设我想改变它的可见性。我可以这样做:

activityMainBinding.llLayout1.root.visibility = View.VISIBLE

使用数据绑定库。然后用<layout>标签包装XML布局

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>

MainActivity.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)
   

...
}

遵循步骤:

    <李> < p > private val binding : FragmentBindingviewBinding(FragmentBinding::bind) < / p >
  1. make sure in "onViewCreated(视图:视图,savedInstanceState: Bundle?)"

     val binding2 = binding.root.include_layout_id
    

例如Val binding = binding.root.tool_bar_layout

现在访问你的include布局,视图。如。

binding2.textView.text = "your text"

在我的例子中,我忘记将id分配给include标记

现在,当你给id赋值后,你就能得到绑定对象为,

YourMainLayoutBinding.YourIncludeTagIDLayoutBinding