自定义视图中的视图绑定

问题描述 投票:0回答:1

之前我在我的项目中使用 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)
   
}

这段代码有什么问题?为什么自定义视图出错?

android kotlin view
1个回答
0
投票

我相信,如果您可以再创建一个文件并在其中使用“”标签来包含您的 fragment_single.xml 和 fragment_double.xml,然后根据您的逻辑使用可见性属性来显示/隐藏它们中的任何一个,我相信而不是膨胀两个不同的文件.

© www.soinside.com 2019 - 2024. All rights reserved.