android - 在片段内获取共享视图模型时出错
问题描述
这是我的视图模型类
class SharedViewModel(val repo :repository) :ViewModel(){
var category : MutableLiveData<MutableList<Category>> = MutableLiveData()
var models : MutableLiveData<MutableList<Models>> = MutableLiveData()
init {
getCategories()
}
private fun getCategories()
{
category =repo.getCategories()
}
fun getModels(collection: String)
{
models = repo.getModels(collection)
}
}
我正在活动中创建视图模型,然后在片段中共享视图模型一切正常,突然间它破坏了活动类 MainActivity 的代码:AppCompatActivity() {
lateinit var activitySharedViewModel: SharedViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val repository = repository()
val viewModelProviderFactory = ViewModelProviderFactory(repository)
activitySharedViewModel = ViewModelProvider(this, viewModelProviderFactory).get(SharedViewModel::class.java)
}
}
这是片段的代码
class CategoryFragment : Fragment() {
lateinit var categoryAdapter : CategoryAdapter
lateinit var sharedViewModels : SharedViewModel
lateinit var binding : FragmentCategoryBinding
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? {
binding = DataBindingUtil.inflate(inflater,R.layout.fragment_category, container, false)
categoryAdapter= CategoryAdapter()
sharedViewModels = (activity as MainActivity).activitySharedViewModel
categoryAdapter.setOnItemClickListener {
val bundle = Bundle().apply {
putString("model",it.CategoryName)
}
findNavController().navigate(R.id.action_categoryFragment_to_modelListFragment,bundle)
}
binding.rvCategory.adapter= categoryAdapter
sharedViewModels.category.observe(viewLifecycleOwner, { response ->
Log.e("list", response.toString())
categoryAdapter.differ.submitList(response.toList())
})
return binding.root
}
}
这是我得到的错误
2020-11-26 16:09:31.015 13509-13509/com.infinity.modelviewerapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.infinity.modelviewerapp, PID: 13509
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.infinity.modelviewerapp/com.infinity.modelviewerapp.MainActivity}: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2957)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: android.view.InflateException: Binary XML file line #9: Binary XML file line #9: Error inflating class fragment
Caused by: android.view.InflateException: Binary XML file line #9: Error inflating class fragment
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:52)
at androidx.navigation.NavArgsLazy.getValue(NavArgsLazy.kt:34)
at com.infinity.modelviewerapp.ui.ModelViewFragment.getArgs(Unknown Source:4)
at com.infinity.modelviewerapp.ui.ModelViewFragment.onCreateView(ModelViewFragment.kt:33)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2950)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:518)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:277)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:2177)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:2094)
at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1990)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3122)
at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:3049)
at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:2975)
at androidx.fragment.app.FragmentStateManager.ensureInflatedView(FragmentStateManager.java:392)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:276)
at androidx.fragment.app.FragmentLayoutInflaterFactory.onCreateView(FragmentLayoutInflaterFactory.java:141)
at androidx.fragment.app.FragmentController.onCreateView(FragmentController.java:135)
at androidx.fragment.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:313)
at androidx.fragment.app.FragmentActivity.onCreateView(FragmentActivity.java:292)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:780)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:863)
at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:824)
at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
at androidx.appcompat.app.AppCompatDelegateImpl.setContentView(AppCompatDelegateImpl.java:696)
at androidx.appcompat.app.AppCompatActivity.setContentView(AppCompatActivity.java:170)
at com.infinity.modelviewerapp.MainActivity.onCreate(MainActivity.kt:15)
at android.app.Activity.performCreate(Activity.java:7183)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2910)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3032)
2020-11-26 16:09:31.027 13509-13509/com.infinity.modelviewerapp E/AndroidRuntime: at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6944)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
Caused by: java.lang.IllegalArgumentException: Required argument "model" is missing and does not have an android:defaultValue
at com.infinity.modelviewerapp.ui.ModelListFragmentArgs$Companion.fromBundle(ModelListFragmentArgs.kt:29)
at com.infinity.modelviewerapp.ui.ModelListFragmentArgs.fromBundle(Unknown Source:2)
... 42 more
解决方案
实现 'androidx.fragment:fragment-ktx:1.3.0-beta01' 导致了这个问题
推荐阅读
- spring-boot - 对在新创建的实例上调用方法的方法进行单元测试?
- typescript - 在 VS 代码中:[ts] 找不到模块 '@src/xxx'
- ms-office - 断字字典如何用于断字?
- cocoapods - 如何为 IOS 构建 OpenWebRTC NativeDemo 应用程序?
- swift - 如何在有人没有点击视图的视图上添加观察者
- bash - bash 对信号没有反应
- google-bigquery - 从包含字典的单元格中提取元素
- wordpress - 从 C# 在 Wordpress 上添加 Espresso 事件
- c# - 如何使用“过滤”绑定列表显示网格数据
- java - 如何在 Vaadin 10 中管理会话?