【问题标题】:How to get included views with Android Databinding?如何使用 Android 数据绑定获取包含的视图?
【发布时间】:2015-10-20 09:13:26
【问题描述】:

我正在使用Android databinding library 并尝试将它与包含的布局一起使用。

我的代码是这样的:

activity_main.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:bind="http://schemas.android.com/apk/res-auto">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id = "@+id/linearLayout">

    <include
        layout="@layout/view" />
  </LinearLayout>
</layout>

view.xml

<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:id = "@+id/myView">
 </View>

MainActivity.java

public MainActivity extends AppCompatActivity{

  private ActivityMainBinding mBinding;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);

    LinearLayout layout = mBinding.linearLayout; // this field is visible
    View myView  = mBinding.myView // THIS FIELD IS NOT VISIBLE
  }


}

正如我在 cmets 中所写的,在“包含”布局中声明的视图 myView 是不可见的。如果我用 view.xml 中的实际代码替换 ,则 mBinding.myView 变得可见,原因似乎是包含。

官方文档仅说明

“数据绑定不支持包含作为合并元素的直接子元素。” 但在我的情况下,View 是 LinearLayout 的子级,它不是直接子级..

有什么提示吗?

【问题讨论】:

    标签: android xml android-layout data-binding


    【解决方案1】:

    您需要为包含语句提供一个 ID:

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

    现在您可以访问包含视图:

    View myView = mBinding.included;
    

    如果您包含的布局是绑定布局,则包含将是生成的绑定。例如,如果 view.xml 是:

    <layout xmlns:android="http://schemas.android.com/apk/res/android">
        <View
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@{@android:color/black}"
            android:id="@+id/myView"/>
    </layout>
    

    那么布局字段将是一个 ViewBinding 类:

    View myView = mBinding.included.myView;
    

    【讨论】:

    • 我怎么能做同样的事情,但对于两个具有相同名称的布局,这是用于平板电脑外壳的布局。我的意思是,当我有两个布局名为 layout/layout.xmllayout-sw600dp/layout.xml 但第二个布局有一个容器 FrameLayout 用于片段时,最后一个不会出现在绑定生成的类中。提前谢谢。
    • 如果您在一个布局中有一个视图,但不是两个,您应该在类中看到该视图,但是当绑定一个布局时它将为空。确保为您希望作为属性的视图提供 ID。
    猜你喜欢
    • 1970-01-01
    • 2016-01-20
    • 2016-01-02
    • 2015-07-28
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多