活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常
Posted
技术标签:
【中文标题】活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常【英文标题】:Activity to Fragment Communication: When I tried to update text view in fragment from activity am getting null pointer exception 【发布时间】:2021-02-14 22:05:11 【问题描述】:我有一个活动和片段。我想将值从活动发送到片段。从活动中调用更新文本视图的片段中的方法。但是我无法更新 UI 出现空指针异常。
首先,我在案例 2 中检查了此链接 link:我按照此代码能够将值从活动发送到片段,它工作正常。但是当我把这条线切入fragment.sendData("Some Text")
按钮单击并粘贴到按钮外部单击其获取空指针异常。fragment.sendData("Some Text")
如何在按钮点击内部而不是在按钮点击外部工作?
我也尝试了相同的概念,添加了代码和错误行。那么任何人都可以帮助我为什么不更新片段中的文本视图>
错误:
com.example.fragments E/androidRuntime: FATAL EXCEPTION: main
Process: com.example.fragments, PID: 3104
java.lang.RuntimeException: Unable to start activity ComponentInfocom.example.fragments/com.example.fragments.MainActivity: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
at com.example.fragments.FragmentTwo.displayUI(FragmentTwo.kt:30)
at com.example.fragments.MainActivity.loadDetailsView(MainActivity.kt:38)
at com.example.fragments.MainActivity.onCreate(MainActivity.kt:32)
at android.app.Activity.performCreate(Activity.java:7825)
at android.app.Activity.performCreate(Activity.java:7814)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1306)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)
MainActivity
import android.os.Bundle
import android.util.LogAv
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity()
lateinit var detailsView:FragmentTwo
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadDetailsView()
private fun loadDetailsView()
detailsView= FragmentTwo()
supportFragmentManager.beginTransaction().replace(R.id.frameLayout,detailsView).commit()
detailsView.displayUI("HELLO")
activity_main
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
tools:context=".MainActivity">
<FrameLayout
android:layout_ android:id="@+id/frameLayout"
android:layout_></FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
片段二
package com.example.fragments
import android.content.Context
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import kotlinx.android.synthetic.main.row_names.*
class FragmentTwo:Fragment()
fun displayUI(string: String)
txtName.setText(string)
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View?
val view:View
view=inflater.inflate(R.layout.fragment_two,container,false)
return view
fragment_two.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_>
<TextView
android:layout_
android:layout_
android:text="HAI"
android:id="@+id/txtName"
android:textSize="16sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.201"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.09" />
</androidx.constraintlayout.widget.ConstraintLayout>
【问题讨论】:
【参考方案1】:Var txtName 为空。 你在 fragment_two.xml 中设置它的 ID 吗?
【讨论】:
是的,我尝试了 android:id="@+id/txtName" 仍然遇到同样的问题..【参考方案2】:您不能在事务替换方法之后立即访问片段方法。 您可以使用 AndroidX Fragment 1.3.0-beta01 中的the new api 在它们之间传递数据
关于文本更改
Activity.supportFragmentManager.setFragmentResult("some_key", bundle_of_data)
并从片段 onCreate 开始收听
Fragment.setFragmentResultListener()
【讨论】:
以上是关于活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常的主要内容,如果未能解决你的问题,请参考以下文章
将数据从片段列表视图项传递到活动字符串变量 onitemclicklistener