2

J'utilise DataBinding et suivant architecture MVVM, maintenant je suis coincé sur la façon d'ajouter un nouveau fragment de ViewModel que nous avons besoin événement click DEFINED ViewModel. Voici ma MainViewModel classeAjouter fragment de ViewModel dans l'architecture MVVM

public class MainViewModel { 
    private Context context; 

    public MainViewModel (Context context) { 
     this.context = context; 
    } 
    public void onClick(View v) { 

    } 
} 

voici mon xml où j'ai défini événement click

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

    <data> 
     <variable 
      name="viewmodel" 
      type="com.example.MainViewModel" /> 
    </data> 

    <RelativeLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:onClick="@{viewmodel::onClick}" 
      android:text="click me"/> 
    </RelativeLayout> 
</layout> 

maintenant comment puis-je obtenir supportFragmentManager ou childFragmentManager de ma classe ViewModel? J'ai essayé d'utiliser activity.getSupportFragmentManager() et activity.getChildFragmentManager() mais il n'a pas ce genre de méthode.

Je sais que nous pouvons ajouter fragment avec le code suivant

getActivity().getSupportFragmentManager().beginTransaction() 
      .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.fade_in, android.R.anim.fade_out). 
      add(R.id.container, fragment, "").addToBackStack("main").commit(); 

mais comment le faire dans ViewModel classe

Répondre

3

Puisque vous avez votre Context disponible, vous avez deux possibilités:

public class MainViewModel { 
    private Context context; 

    public MainViewModel (Context context) { 
     this.context = context; 
    } 

    public void onClick(View v) { 
     //use context: 
     ((AppCompatActivity) context).getSupportFragmentManager(); 

     //OR use the views context: 
     if(v.getContext() instanceof AppCompatActivity) { 
      ((AppCompatActivity) v.getContext()).getSupportFragmentManager(); 
     }    
    }  
} 

Il peut être utile de vérifier si le contexte est une instance de votre activité (comme MainActivity) ou AppCompatActivity, ou s'il s'agit de null avant d'appeler une méthode.

0

Je ne sais pas s'il est possible, mais voici ce que je suggère:

Définir une interface et laisser l'activité ou le fragment implémenter cette interface

public interface FragmentProvider { 
    void showFragment(...); 
} 

Passer une instance de FragmentProvider dans votre ViewModel

public class MainViewModel { 
    private Context context; 
    private FragmentProvider provider; 

    public MainViewModel (FragmentProvider provider) { 
     this.provider = provider; 
    } 

    public void onClick(View v) { 
     // delegate the action 
     provider.showFragment(...); 
    } 

}

+0

oui c'est disponible, mais je ne suis pas sûr que ce soit une bonne idée ou pas quand on travaille avec mvvm. –

+0

Je voudrais aller avec genre d'idée EventBus c'est la meilleure solution alors la première réponse acceptée ici. – Jileshl

+0

Je voudrais aller avec genre d'idée EventBus c'est une meilleure solution alors la première réponse acceptée ici. – Jileshl