活动到片段通信:当我尝试从活动更新片段中的文本视图时,出现空指针异常

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

从活动更新视图页面中片段中的列表视图

如何将数据从活动传输到片段? [复制]

共享元素转换:活动到嵌套在另一个活动中的片段

想要使用片段从导航抽屉活动移动到另一个屏幕,以在所有屏幕上显示抽屉

包含viewpager的android活动缓慢打开