2015-10-20 2 views
6

Я играю с Android databinding library, и я пытаюсь использовать его с включенными макетами.Как получить включенные представления с Android Databinding?

код у меня есть, как это:

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 
    } 


} 

Как я уже писал в комментариях v iew myView, объявленный в «включенном» макете, не отображается. Если я заменю фактический код в view.xml, тогда mBinding.myView станет видимым, тогда причина будет включать.

Официальные состояния документации только что

«Связывание данных не поддерживает включать в качестве прямого потомка совмещенную элемента.» , но в моем случае View является ребенком LinearLayout, это не прямой ребенок ..

Любые подсказки?

ответ

14

Вам необходимо предоставить идентификатор включаемого заявление:

<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; 
+0

Как я могу сделать то же самое, но для двух макетов с таким же именем, это для макета для планшетный чехол. Я имею в виду, когда у меня есть два макета с именем «layout/layout.xml» и «layout-sw600dp/layout.xml», а во втором - контейнер «FrameLayout» для фрагментов, это последнее не появляется в классе сгенерированного связывания. Заранее спасибо. – epool

+1

Если у вас есть представление в одном макете, но не для обоих, вы должны увидеть представление в классе, но оно будет равно null, когда один макет связан. Не забудьте указать идентификаторы для просмотров, которые вы хотите иметь в качестве свойств. –

Смежные вопросы