2

에 뷰 모델에서 조각을 추가합니다. 여기 내 MainViewModel 클래스지금은 우리가 <code>ViewModel</code>에 정의 된 클릭 이벤트를 필요로하는 <code>ViewModel</code>에서 새로운 조각을 추가하는 방법에 부착하고, 내가 <strong>MVVM 아키텍처</strong> 다음 <code>DataBinding</code>를 사용하고 MVVM 아키텍처

public class MainViewModel { 
    private Context context; 

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

    } 
} 

는 여기 지금 난 내 뷰 모델 클래스 supportFragmentManager 또는 childFragmentManager을 얻을 수있는 방법 클릭 이벤트

<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> 

을 정의 내 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(...); 
} 

당신의 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(...); 
    } 

}에 FragmentProvider의 인스턴스를 전달

+0

예, 가능 합니다만, mvvm으로 작업 할 때 좋은 생각인지 아닌지 잘 모르겠습니다. –

+0

EventBus와 같은 아이디어를 제안하고 싶습니다. – Jileshl

+0

EventBus와 같은 아이디어를 제안하고 싶습니다. – Jileshl