AndroidViewModel
用于访问Application
上下文。我试图访问Activity
FragmentManager
而未明确传递它:
class FooViewModel(app: Application) : AndroidViewModel(app) {
private val fm = (app.applicationContext as Activity).fragmentManager
..
}
收到错误,无法将Context
投射到Activity
。
问题:有没有办法在FragmentManager
内AndroidViewModel
明确传递它?
答案 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
。
FragmentManager
是FragmentManager
的子类可能具有的对象。 FragmentActivity
不是Application
的子类。
另一个问题是,为什么你需要FragmentActivity
内的FragmentManager
个实例?大多数情况下,您应该将与视图相关的内容委托给ViewModel
以外的其他单位(例如ViewModel
,Activity
)。请注意,这个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
}
我希望有所帮助