Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ViewBinding-如何获得包含布局的绑定?_Android_Android Viewbinding - Fatal编程技术网

Android ViewBinding-如何获得包含布局的绑定?

Android ViewBinding-如何获得包含布局的绑定?,android,android-viewbinding,Android,Android Viewbinding,在使用ViewBinding时,我遇到了一些未记录的案例 第一:如何获得包含的通用视图布局部件的绑定,主绑定仅查看主布局中的项目 第二:如何为包含的合并类型布局部件获取绑定,同样,主绑定只查看主布局中的项目?在以下情况下: 包含通用布局(不是合并节点),我们需要将ID分配给包含的部分,这样在绑定中我们就可以访问包含的子部分 在外部布局中包含合并块。无法向其添加ID,因为合并块不是视图。 假设我们有这样一个永恒的合并布局(merge_layout.xm): 您的第一个问题,即使用ViewBindi

在使用ViewBinding时,我遇到了一些未记录的案例

第一:如何获得包含的通用视图布局部件的绑定,主绑定仅查看主布局中的项目

第二:如何为包含的合并类型布局部件获取绑定,同样,主绑定只查看主布局中的项目?

在以下情况下:

  • 包含通用布局(不是合并节点),我们需要将ID分配给包含的部分,这样在绑定中我们就可以访问包含的子部分
  • 在外部布局中包含合并块。无法向其添加ID,因为合并块不是视图。 假设我们有这样一个永恒的合并布局(merge_layout.xm):

  • 您的第一个问题,即使用ViewBinding处理包含的布局,可以很容易地解决

    下面是一个示例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>
    

    现在,您有两个绑定。其中一个是默认值,下一个来自包含布局。

    在包含布局中,您必须创建容器布局并将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);
    
    private lateinit var binding: ActivityMainBinding  
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    
        // Access include layout views
        binding.root.ivImage.setImageResource(R.drawable.ic_back_arrow)
        binding.root.tvTitle.text = getString(R.string.home)
       
        ...
    }
    
    确保主布局绑定父根目录为LinearLayout, includedLayoutBinding父布局也可以是线性布局


    这也可以在不设置
    include
    id
    的情况下实现

    活动\u main.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">
    
        ... 
    
        <include layout="@layout/toolbar" />
        
        ...
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/llRootLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView 
            android:id="@+id/ivImage"
            ... />
    
        <TextView 
            android:id="@+id/tvTitle"
            ... />
    
    
    </LinearLayout>
    

    回答非常简单,并使用了新的语法-所有这些都在
    onCreate()
    中使用类似语法的非片段活动中为我工作。谢谢(只是在使用抽屉布局时遇到了一些问题)我得到一个运行时NPE,它说缺少ID为blah的必需视图。@Asim可能如果您将包含的布局从“合并”更改为某个视图组,则必须在包含合并视图的文件中添加
    layout
    标记。我试图在片段中而不是在活动中执行此操作,但它不起作用。我已经将global_header设置为我的include项的id,实际上android studio中的自动完成功能非常好,并且自动完成viewBindings.globalHeader,因此它是为绑定生成的,但在运行时崩溃:“java.lang.NullPointerException:缺少id为com.daon.ps.daonboard:id/global_header的必需视图”@FranMarzoa你确定你在Fragments onCreateView中完成了所有需要的操作吗?比如:
    val binding=FrgamentSomethingSomething.inflate(layoutInflater)
    返回binding.root
    @FranMarzoa还要记住,
    binding.globalHeader
    不会返回视图-它将是GlobalHeaderBinding(或任何你称之为布局文件的东西)在里面你会找到所有包含的视图。它在膨胀布局时崩溃了,我甚至没有机会访问它。无论如何,我在这里找到了一个解决方案并对这个问题进行了很好的解释:另一种简单的方法是使用数据绑定库。然后,使用标记包装XML布局,以便在使用库时自动生成将布局中的视图与数据对象绑定所需的类。老实说,我认为这是一条路。遵循指南嗨,我已经写了一篇博客文章,完全解释了视图绑定,以及使用合并和包含布局签出的包含标记的处理,我有点困在这里:您正在使用Kotlin synthetics访问包含的视图,这个API已经不需要显式绑定包含的布局,如果为其指定id,则会自动执行此操作:
    。之后,字段
    mainLayoutBinding.myToolbar
    将包含嵌套绑定。
    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);
    
    <?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">
    
        ... 
    
        <include layout="@layout/toolbar" />
        
        ...
    
    </LinearLayout>
    
    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/llRootLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <ImageView 
            android:id="@+id/ivImage"
            ... />
    
        <TextView 
            android:id="@+id/tvTitle"
            ... />
    
    
    </LinearLayout>
    
    private lateinit var binding: ActivityMainBinding  
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)
    
        // Access include layout views
        binding.root.ivImage.setImageResource(R.drawable.ic_back_arrow)
        binding.root.tvTitle.text = getString(R.string.home)
       
        ...
    }