之前我在我的项目中使用 Kotlin Synthetics。现在转移到查看绑定。我在 viewBinding 中遇到问题,无法在自定义视图中绑定视图。
我有 2 个布局,分别命名为
fragment_single.xml
和 fragment_double.xml
.
我正在为
fragment
中的两个布局充气,如下所示
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View {
val view: View =
if (centered) {
_fragmentFxlLayoutSingleBinding = FragmentFxllayoutSingleBinding.inflate(layoutInflater)
fragmentFxlLayoutSingleBinding.root
} else {
_fragmentFxlLayoutDoubleBinding = FragmentFxllayoutDoubleBinding.inflate(layoutInflater)
fragmentFxlLayoutDoubleBinding.root
}
}
现在我有自定义视图
Fxllayout
它扩展了 Framelayout
并想在自定义视图中膨胀相同的绑定。但是当我膨胀布局时,我在自定义视图中遇到错误。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.bolindadigital.BorrowBoxLibrary.debug, PID: 29575
android.view.InflateException: Binary XML file line #10 in com.bolindadigital.BorrowBoxLibrary.debug:layout/fragment_fxllayout_double: Binary XML file line #10 in com.bolindadigital.BorrowBoxLibrary.debug:layout/fragment_fxllayout_double: Error inflating class com.bolinda.digital.library.mobile.android.readium2.libs.navigator.fxl.R2FXLLayout
Caused by: android.view.InflateException: Binary XML file line #10 in com.bolindadigital.BorrowBoxLibrary.debug:layout/fragment_fxllayout_double: Error inflating class com.bolinda.digital.library.mobile.android.readium2.libs.navigator.fxl.R2FXLLayout
Caused by: java.lang.NoSuchMethodException: com.bolinda.digital.library.mobile.android.readium2.libs.navigator.fxl.R2FXLLayout.<init> [class android.content.Context, interface android.util.AttributeSet]
at java.lang.Class.getConstructor0(Class.java:2332)
at java.lang.Class.getConstructor(Class.java:1728)
at android.view.LayoutInflater.createView(LayoutInflater.java:822)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1004)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:959)
at android.view.LayoutInflater.inflate(LayoutInflater.java:657)
at android.view.LayoutInflater.inflate(LayoutInflater.java:532)
at com.bolindadigital.BorrowBoxLibrary.databinding.FragmentFxllayoutDoubleBinding.inflate(FragmentFxllayoutDoubleBinding.java:80)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.fxl.R2FXLLayout.init(R2FXLLayout.kt:189)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.fxl.R2FXLLayout.<init>(R2FXLLayout.kt:1187)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.pager.R2FXLPageFragment.onCreateView(R2FXLPageFragment.kt:231)
at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2995)
at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:523)
at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1840)
at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1758)
at androidx.fragment.app.FragmentManager.execSingleAction(FragmentManager.java:1670)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:323)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.pager.R2FragmentPagerAdapter.finishUpdate(R2FragmentPagerAdapter.kt:133)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.pager.R2RTLViewPager$ReversingAdapter.finishUpdate(R2RTLViewPager.java:338)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1244)
at androidx.viewpager.widget.ViewPager.populate(ViewPager.java:1092)
at androidx.viewpager.widget.ViewPager.setAdapter(ViewPager.java:540)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.pager.R2RTLViewPager.setAdapter(R2RTLViewPager.java:101)
at com.bolinda.digital.library.mobile.android.readium2.libs.navigator.epub.R2EpubActivity$calculateResourcePagerAdapterState$1.invokeSuspend(R2EpubActivity.kt:754)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at androidx.lifecycle.DispatchQueue.drainQueue(DispatchQueue.kt:75)
at androidx.lifecycle.DispatchQueue.enqueue(DispatchQueue.kt:112)
at androidx.lifecycle.DispatchQueue.access$enqueue(DispatchQueue.kt:31)
at androidx.lifecycle.DispatchQueue$dispatchAndEnqueue$$inlined$with$lambda$1.run(DispatchQueue.kt:100)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7697)
at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:952)
我正在自定义视图中膨胀布局,如下所示。
private fun init(context: Context) {
_fragmentFxlLayoutDoubleBinding = FragmentFxllayoutDoubleBinding.inflate(LayoutInflater.from(context), this, false)
_fragmentFxlLayoutSingleBinding = FragmentFxllayoutSingleBinding.inflate(LayoutInflater.from(context), this, false)
}
这段代码有什么问题?为什么自定义视图出错?
我相信,如果您可以再创建一个文件并在其中使用“”标签来包含您的 fragment_single.xml 和 fragment_double.xml,然后根据您的逻辑使用可见性属性来显示/隐藏它们中的任何一个,我相信而不是膨胀两个不同的文件.