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

33 Views Asked by At

I can't access a Button or TextView in layout after binding by DataBindingUtil.

The button or textView can not be accessed by binding layout, if it have not binding a in xml, only can be accessed by findViewById() function.

The button or textView can be accessed by binding layout, if it have binding a in xml.

[Layout code]:

<?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 fragment code]:


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")
        }**
    }
}

[AndroidRuntime log]:

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

Please help me guide and solve this anomaly, thank you very much! Best Regards! WuXiaoyu

0

There are 0 best solutions below