在AndroidViewModel中获取FragmentManager

时间:2017-06-15 10:42:00

标签: android android-fragments kotlin fragmentmanager android-architecture-components

AndroidViewModel用于访问Application上下文。我试图访问Activity FragmentManager而未明确传递它:

class FooViewModel(app: Application) : AndroidViewModel(app) {
  private val fm = (app.applicationContext as Activity).fragmentManager
  ..
}

收到错误,无法将Context投射到Activity

问题:有没有办法在FragmentManagerAndroidViewModel明确传递它?

2 个答案:

答案 0 :(得分:5)

我认为简短的回答将是“不,没有办法”,因为protected void CheckCourse_CheckedChanged(object sender, EventArgs e) { CheckBox checkhome = (CheckBox)sender; ListViewItem item = (ListViewItem)checkhome.NamingContainer; ListViewDataItem dataItem = (ListViewDataItem)item; string code = ListCourse.DataKeys[dataItem.DisplayIndex].Value.ToString(); int CID = Convert.ToInt32(code); Course_Master objnew = DB.Course_Master.Single(p => p.CID == CID); bool IsHome = CheckOnHome(CID); if (IsHome == true) { if (checkhome.Checked == false) { objnew.ShowOnHomePage = false; } } else { if (checkhome.Checked == true) { objnew.ShowOnHomePage = true; } } DB.SaveChanges(); } 上下文不知道Application

FragmentManagerFragmentManager的子类可能具有的对象。 FragmentActivity不是Application的子类。

另一个问题是,为什么你需要FragmentActivity内的FragmentManager个实例?大多数情况下,您应该将与视图相关的内容委托给ViewModel以外的其他单位(例如ViewModelActivity)。请注意,这个Fragment会保留在配置更改之上,因此如果您在ViewModel内保留对FragmentManager的引用,则会泄露您的ViewModel实例

答案 1 :(得分:-2)

我知道为时已晚,但是当我在viewmodel中搜索片段管理器时,在Google结果的顶部找到了这个答案:)

好。我非常搜索并找到了一种方法 (KOTLIN lang)您可以转换为Java

 fun changeFrag(view:View) {

        val uiHandler = Handler()
        uiHandler.post { (getActivity(view.rootView) as AppCompatActivity).supportFragmentManager.beginTransaction().replace(R.id.main_frame, MainPageFragment()).commitNow() }
    }

从xml或其他类设置视图。 而getActivity()函数是:

private fun getActivity(view: View): Activity {
    return view.findViewById<View>(android.R.id.content).context as Activity
}

我希望有所帮助