提问人:wuxiaoyu 提问时间:10/8/2023 更新时间:10/8/2023 访问量:30
使用 DataBinding 使用 Kotlin 实现的片段无法访问 Layout 中的视图 (Button/TestView)
Fragment implemented with Kotlin, using DataBinding cannot access to Views (Button/TestView) in Layout
问:
通过 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
请帮我指导和解决这个异常,非常感谢! 此致敬意! 吴晓宇
答: 暂无答案
评论
onResume