This is a memo code. ARFragment on Fragment I use childFragmentManager

Code

This is MyFragment.kt.

import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.Nullable
import com.google.ar.core.*

class MyFragment : Fragment() {

    private lateinit var arFragment: MyARFragment
    private var arShowing: Boolean = false

    override fun onCreateView(
        inflater: LayoutInflater, @Nullable container: ViewGroup?, @Nullable savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_sample, container, false)
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        arFragment = childFragmentManager.findFragmentById(R.id.ar_fragment) as MyARFragment
        arFragment.arSceneView.scene
            .addOnUpdateListener {
                onUpdateFrame()
            }
     }

    private fun onUpdateFrame() {
        val frame = arFragment.arSceneView.arFrame ?: return
        // If there is no frame, just return.
        val updatedAugmentedImages =
            frame.getUpdatedTrackables(
                AugmentedImage::class.java
            )
        for (augmentedImage in updatedAugmentedImages) {
            when (augmentedImage.trackingState) {
                TrackingState.TRACKING -> {
                    if(!arShowing){
                        val anchor =  arFragment.arSceneView.session!!.createAnchor(augmentedImage.centerPose)
                        val node =
                            MyViewNode(context)
                        node.setImage(augmentedImage, anchor)
                        arFragment.arSceneView.scene.addChild(node)
                        arShowing = true
                    }
                }
                TrackingState.STOPPED -> {
                    arShowing = false
                }
            }
        }
    }
}

This is fragment_sample.xml.

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".fragment.MyFragment">

    <fragment android:name="io.mizuki.fragment.MyARFragment"
        android:id="@+id/ar_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</FrameLayout>

This is MyViewNode.xml

import android.content.Context
import android.util.Log
import android.widget.TextView
import com.google.ar.core.Anchor
import com.google.ar.core.AugmentedImage
import com.google.ar.core.Pose
import com.google.ar.sceneform.AnchorNode
import com.google.ar.sceneform.Node
import com.google.ar.sceneform.math.Quaternion
import com.google.ar.sceneform.math.Vector3
import com.google.ar.sceneform.rendering.Color
import com.google.ar.sceneform.rendering.ExternalTexture
import com.google.ar.sceneform.rendering.FixedHeightViewSizer
import com.google.ar.sceneform.rendering.ViewRenderable
import java.util.concurrent.CompletableFuture

class CommentViewNode(context: Context?) : AnchorNode() {

    init {
        argumentedView = ViewRenderable.builder()
          .setView(context, R.layout.ar_view)
          .setVerticalAlignment(ViewRenderable.VerticalAlignment.BOTTOM)
          .setSizer(FixedHeightViewSizer(0.09f))
          .build()
    }

    fun setImage(aImage: AugmentedImage, aAnchor: Anchor) {
        image = aImage
        viewAnchor = aAnchor
        if (!argumentedView!!.isDone) {
            CompletableFuture.allOf(
                argumentedView
            )
                .thenAccept {
                    setImage(
                        image,
                        viewAnchor
                    )
                }
                .exceptionally { throwable: Throwable? ->
                    Log.e(
                        TAG,
                        "Exception loading",
                        throwable
                    )
                    null
                }
        }

        argumentedView!!.thenAccept { viewRenderable ->
            anchor = image.createAnchor(
                image.centerPose)
            
            // Add setting of view
            val view = viewRenderable.view
            view.findViewById<TextView>(R.id.txtView).text = "Message" 

            val node = Node()
            node.setParent(this)
            node.renderable = viewRenderable
            val pose = Pose.makeTranslation(0.0f, 0.0f, 0.12f)
            node.localRotation = Quaternion(pose.qx(), 90f, -90f, pose.qw())
        }
    }

    companion object {
        private var argumentedView: CompletableFuture<ViewRenderable>? = null
        private lateinit var image: AugmentedImage
        private lateinit var viewAnchor: Anchor
        private val TAG = this::class.java.simpleName
    }
}

Ref

ARCore Augmented Images