使用 DataBinding 使用 Kotlin 实现的片段无法访问 Layout 中的视图 (Button/TestView)

Fragment implemented with Kotlin, using DataBinding cannot access to Views (Button/TestView) in Layout

提问人:wuxiaoyu 提问时间:10/8/2023 更新时间:10/8/2023 访问量:30

问:

通过 DataBindingUtil 绑定后,我无法访问布局中的 Button 或 TextView。

button 或 textView 不能通过绑定布局来访问,如果它没有绑定 a in xml,只能通过 findViewById() 函数访问。

按钮或 textView 可以通过绑定布局来访问,如果它在 xml 中具有绑定 a。

[布局代码]:

<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" >

    <data>
        <variable name="testviewString" type="String" />
    </data>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        
        <!-- This button can be access, it have binding a "<variable>" -->
        <TextView
            android:id="@+id/test_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:gravity="center"
            android:text="@{testviewString}" />

        <!-- This button can not be access, it have not binding a "<variable>" -->
        <Button
            android:id="@+id/test_bt"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Button" />
    </LinearLayout>
</layout>

[Kotlin 片段代码]:


import android.app.Activity
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import com.oplus.engineernetwork.R
import com.oplus.engineernetwork.databinding.LayoutTestFragmentBinding

class TestFragment : Fragment() {
    private val mLogger: Logger = LoggerFactory.getLogger(TestFragment::class.java)
    private var mTvString: String = "Test TestView"
    private lateinit var mLayout: LayoutTestFragmentBinding
    private var mActivity: Activity? = null

    companion object {
        @JvmStatic
        fun newInstance(phoneId: Int): TestFragment {
            val slotFragment = TestFragment()
            val args = Bundle()
            args.putInt("phoneId", phoneId)
            slotFragment.arguments = args
            return slotFragment
        }
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        mLogger.debug("onCreateView")
        mLayout = DataBindingUtil.inflate(inflater, R.layout.layout_test_fragment, container, false)
        mLayout.testviewString = mTvString

        return mLayout.root
    }

    override fun onResume() {
        super.onResume()
        mLogger.debug("onResume")
        if (mLayout.testTv == null) {
            mLogger.error("onResume mLayout.testTv == null")
        } else {
            mLogger.debug("onResume mLayout.testTv != null")
        }
        /* !!! ERROR !!! Hera mLayout.testBt == null */
        **if (mLayout.testBt == null) { 
            mLogger.error("onResume mLayout.testBt == null") // This log will be print
        } **else {
            mLogger.debug("onResume mLayout.testBt != null")
        }
       /* The app will crash here, reason: 
        * java.lang.RuntimeException: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
        */
        **mLayout.testBt.setOnClickListener {
            mLogger.debug("testBt onclick")
        }**
    }
}

[Android运行时日志]:

AndroidRuntime: Shutting down VM
AndroidRuntime: FATAL EXCEPTION: main
AndroidRuntime: Process: com.oplus.engineernetwork, PID: 30629
AndroidRuntime: java.lang.RuntimeException: Unable to resume activity {com.oplus.engineernetwork/com.oplus.engineernetwork.register.radioinfodatabinding.ui.RadioInfoActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
AndroidRuntime:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5275)
AndroidRuntime:     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:5318)
AndroidRuntime:     at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:64)
AndroidRuntime:     at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:185)
AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2627)
AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:106)
AndroidRuntime:     at android.os.Looper.loopOnce(Looper.java:257)
AndroidRuntime:     at android.os.Looper.loop(Looper.java:368)
AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:8812)
AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
AndroidRuntime:     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:572)
AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1049)
AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
AndroidRuntime:     at com.oplus.engineernetwork.register.radioinfodatabinding.ui.TestFragment.onResume(TestFragment.kt:61)
AndroidRuntime:     at androidx.fragment.app.Fragment.performResume(Fragment.java:3039)
AndroidRuntime:     at androidx.fragment.app.FragmentStateManager.resume(FragmentStateManager.java:607)
AndroidRuntime:     at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:306)
AndroidRuntime:     at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112)
AndroidRuntime:     at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647)
AndroidRuntime:     at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128)
AndroidRuntime:     at androidx.fragment.app.FragmentManager.dispatchResume(FragmentManager.java:3086)
AndroidRuntime:     at androidx.fragment.app.FragmentController.dispatchResume(FragmentController.java:273)
AndroidRuntime:     at androidx.fragment.app.FragmentActivity.onResumeFragments(FragmentActivity.java:458)
AndroidRuntime:     at androidx.fragment.app.FragmentActivity.onPostResume(FragmentActivity.java:447)
AndroidRuntime:     at androidx.appcompat.app.AppCompatActivity.onPostResume(AppCompatActivity.java:204)
AndroidRuntime:     at android.app.Activity.performResume(Activity.java:8943)
AndroidRuntime:     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:5257)
AndroidRuntime:     ... 13 more

请帮我指导和解决这个异常,非常感谢! 此致敬意! 吴晓宇

Kotlin android-fragments android-databinding

评论

0赞 TheLibrarian 10/9/2023
您需要做什么(为什么)?onResume

答: 暂无答案