2017-09-13 13 views
1

Dans mon projet, j'ai plusieurs modules, disons l'application module et le module A qui agissent comme une bibliothèque pour l'application module. J'utilise de liaison de données et fonctionne très bien en ajoutantLiaison de données Android avec le module <include> dans le module de bibliothèque

dataBinding { enabled = true }

dans chaque build.gradle du module.

Le problème est survenu lorsque j'utilise l'étiquette <include> dans la disposition du module A. Il plante quand on appelle setContentView de DataBindingUtil.

java.lang.NullPointerException: tentative d'invoquer la méthode virtuelle de com.package.name.databinding.ViewToolbarBinding.invalidateAll void() 'sur une référence d'objet null

Cependant, il fonctionne très bien dans la application du module, je suis en mesure d'accéder à la vue en utilisant quelque chose comme ça.

mBindingUtil.includedLayout.viewInTheIncludedLayout 

Ceci est ma mise en page de l'activité dans le module A:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<LinearLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <include layout="@layout/view_toolbar" 
     android:id="@+id/toolbar_layout"/> 

</LinearLayout> 

</layout> 

Et voici mon view_toolbar.xml dans le module A:

<?xml version="1.0" encoding="utf-8"?> 
<layout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<android.support.v7.widget.Toolbar 
    android:id="@+id/toolbar" 
    style="@style/ToolbarTheme" 
    android:layout_width="match_parent" 
    android:layout_height="?attr/actionBarSize" 
    android:background="@color/primary_blue" 
    android:theme="@style/AppTheme" 
    app:elevation="0dp" /> 

</layout> 

Bien que ce soit la façon dont je l'activité gonfler module A:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mBinding = DataBindingUtil.setContentView(this, R.layout.activity_with_include); 
} 

Toute aide est appréciée. Merci

Répondre

0

Vous devez gonfler une vue qui utilise la liaison de données à l'aide DataBindingUtil.inflate au lieu de DataBindingUtil.setContentView:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     mBinding = DataBindingUtil.inflate(inflater, R.layout.yourlayoutfile, container, false); 
     //viewmodel assigned in oncreate() 
     mBinding.setViewModel(yourViewModel); 
     return mBinding.getRoot(); 
    } 

Si vous regardez le docs, vous verrez que la méthode pour DataBindingUtil.setContentView dit:

Définissez la vue de contenu de l'activité sur la mise en page donnée et renvoyez la liaison associée . La ressource de mise en page donnée ne doit pas être une mise en page de fusion.

Je pense qu'il est prudent de supposer que cela inclut include étiquettes. Donc, si vous utilisez le DataBindingUtil.inflate vous devriez être en sécurité. Vous devez également noter que toute l'installation de l'interface utilisateur doit être effectuée dans le onCreateView() plutôt que onCreate().

+0

Merci. Cependant, cela ne fonctionnera que sur fragment. Je l'ai essayé sur l'activité et son ne fonctionne pas. – luthfihariz