2

添加片段我使用DataBinding及以下MVVM架構,現在我被困在如何從ViewModel添加新的片段,因爲我們需要對ViewModel定義的點擊事件我。這裏是我MainViewModel從視圖模型在MVVM架構

public class MainViewModel { 
    private Context context; 

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

    } 
} 

這是我在那裏我已經定義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> 

現在我怎樣才能從我的ViewModel類supportFragmentManagerchildFragmentManager XML?我試圖使用activity.getSupportFragmentManager()activity.getChildFragmentManager(),但它沒有這種方法。

我知道我們可以用下面的代碼添加片段

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(); 

,但如何做到這一點的ViewModel

回答

3

既然你有你的Context可用,你有兩種可能性:

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(); 
     }    
    }  
} 

這可能是有用的,以檢查是否上下文是您的活動的一個實例(如MainActivity)或AppCompatActivity,或者在調用任何方法之前是null

0

我不知道這是否是可能的,但這裏是我的建議:

定義一個接口並讓Activity或Fragment實現此接口

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

傳遞FragmentProvider的實例到您的視圖模型

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

是的,這是可用的方式,但我不確定在使用mvvm時這是否是個好主意。 –

+0

我想用EventBus類型的想法,這是更好的解決方案,然後在這裏接受的第一個答案。 – Jileshl

+0

我想用EventBus類型的想法,這是更好的解決方案,然後在這裏第一個接受的答案。 – Jileshl